2011-04-18 4 views
0

structs에 파일을 읽고 서버에 씁니다. 다음은 코드 스 니펫입니다.tcp 소켓을 사용하여 송신 구조

struct b{ 
uint16_t num; 
char str[10]; 
} x; 
struct a{ 
uint32_t pid; 
char str1[10]; 
char str2[10]; 

} y;

while(fscanf(fp,"%s",buff) != EOF) 
while(1){ 
c = getchar(); 
if (c == '\n') 
break; 

else 
buff[i]= c ; 
i++; 

write(fd, &b,sizeof(b)) 

텍스트 파일 형식

  • 123
  • 조지
  • 가 어떻게 읽고 각각의 구조체에 파일을 저장할 수 있습니까?

  • 내가 서버에 기록 할 때,

  • 쓰기 생겼 (FD, & A,를 sizeof (구조체 A)). 쓰기 (fd, & b, sizeof (struct b))? 올바른 패딩을 확인하는 방법 , 엔디안

이 내가 파일을 실행하는 방법이다 : IP PORT < file.txt를 /a.out는 "읽고 각각의 구조체에 파일을 저장할"라고

+0

가능한 [TCP를 통한 송신 구조체 (C 프로그래밍)] (http://stackoverflow.com/questions/1734819/sending-struct-over-tcp-c-programming) –

+0

스택 오버플로에 오신 것을 환영합니다! 새로운 질문을하기 전에 검색을 이용하십시오. 많은 질문이 SO에 이미 묻고 당신은 당신의 응답을 즉각 찾아 낼지도 모른다. –

답변

0

그 질문을 분명히 해 주시겠습니까?

오른쪽 패딩 및 엔디안을 보장하기 위해, 두 가지 작업을 수행해야한다 :
  1. 한 번에 구조체 하나 개의 필드를 보냅니다. 그것은 고통입니다. 각각의 구조체 멤버를 uint16_t 타입 (그리고 그 패밀리)으로 선언하고 있기 때문에 sizeof()는 모든 플랫폼에서 동일한 대답을 줄 것이다.

  2. endianness를 보장하려면 호스트 - 네트워크 주문 제품군을 사용해야합니다. 참조 : http://www.gnu.org/s/hello/manual/libc/Byte-Order.html

  3. 이렇게하면 전송시 htons() (네트워크 단락 호스트)을 사용해야하고 수신하면 ntohs() (네트워크 단락 호스트)을 사용해야합니다. 구조체의 각 멤버에 대해.

종종 사람들은 이것을 무시합니다. 두 컴퓨터가 모두 현대 인텔 박스라면, 이는 대다수의 사람들에게 사실입니다. 구조체를 전송할 때 사용하는 코드를 사용할 수 있습니다. 그러나 당신이 언급 한 것처럼, 그것은 패딩과 endinaness을 보장하지 않습니다!

패딩 처리 방법을 지정하는 데 #pragma pack() GNU 지시어를 사용할 수도 있습니다. 이것은 클라이언트와 서버 모두에 대해 GNU toolchain을 의지 할 수 있다면 C 사양의 일부가 아니기 때문에 가능합니다.

0

구조체에 send/recv (소켓) 또는 읽기/쓰기 (파일 설명자)를 사용하지 마십시오. 나중에 깨질 수 있습니다. 다른 문제 중, 구조체 멤버의 패딩 및/또는 정렬은 컴파일러, 컴파일 옵션 및 환경에 따라 달라질 수 있습니다.

대신 텍스트와 같은 독립된 형식으로 데이터를 마샬링하고 보냅니다. 데이터가 양면에서 절대적으로 동일해야하는 경우에는 64로 인코딩하고 체크섬을 추가하십시오.

절대적으로 이진 데이터를 전송해야하는 경우 각 구조 구성원을 네트워크 바이트 순서 (man byteorder)로 변환하고 각각을 개별적으로 보내야합니다.

관련 문제