2012-05-24 3 views
0

인터넷 소켓 (UDP)을 통해 데이터를 전송하는 프로그램이 있습니다. 따라서 데이터 패킷으로 char 배열이 정의됩니다. 예 : char packet1[] = 11 (헤더 [2 자리]) + 192.168.100.158 (sender_IP [15 자리]) + 006 (TTL [3 자리]) + (11192.168.100.158006...). 수신기는 배열 색인에 따라 데이터를 추출합니다 (예 : 0-1은 헤더, 2-16은 sender_IP).C 소켓의 데이터 전송

내 문제가 I [2-16]와 같은 경우 sender_IP을 정의 할 때 IP 어드레스가 15 자리보다 짧은 (예를 들면 192.168.100.5) 다음, 수신기는 데이터가 잘못 추출이 있다는 것이다. 내 질문에 IP 주소가 15 자리 또는 14 자리 (sender_IP의 문자열 길이를 정의하는 추가 문자를 추가하지 않고도) 인 경우에도 sender_IP가 올바르게 추출되는지 어떻게 확인할 수 있습니까?

나는`

struct packet { 
    char header[1]; 
    char senderIP[15] 
    , TTL[2]; 
    }; 

같은 것을 구조체 유형을 작성하고 정의 생각했다. 그러나 나는 buf 대신에 sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen)을 작성해야한다. 왜냐하면 buf은 내가 아는 한 char 일 필요가 있기 때문이다. 일부 데이터를 sender_IP 주소 (inet_aton(sender_IP, &si_other.sin_addr)으로 보내면 ASCII 표현으로 IP 주소가 필요합니다.

나는 모든 제안을 부탁드립니다. 미리 감사드립니다.

+1

1) 공백으로 채 웁니다. 2) nul-terminate? – wildplasser

+1

그건 그렇고, buf는 char * 일 필요는없고, struct 나 다른 타입의 포인터 일 수도 있지만, 플랫폼과 컴파일러 사이의 차이점과 패킹과 엔디 언스로 인해 소켓을 통해 직접 구조체를 보내고 싶지는 않습니다 . –

답변

1

32 비트 INT로의 IP에 전송하거나, 적절한 길이, 예를 들어 정도로 0으로 문자열 팩 192.168.100.005.

+0

여전히 네트워크 바이트 순서 문제가 있습니다. ascii는 이것을 피합니다. – wildplasser

+0

참. 소켓을 통해 int를 전송하려는 경우 htonl() 및 ntohl()을 사용하려고합니다. –

1

= 같은 제한 - 그룹 문자를 사용하여 "!" 또는 "XXX"그것을 감지는 감지

1

별도의 추가 NUL 바이트를위한 장소를 만들기 위해 한 번 더 바이트가있는 지역의 구조체에 복사 할 수있는 방법이 있습니다를 시작하는 위치를 알 수 있습니다.

struct packet *in; 
struct cooked_packet { 
    char header[1]; 
    char sender_ip[1+ sizeof in->ip]; 
    char ttl[2]; 
    } this; 

this.header = in.header; 
strncpy(this.ip, in->ip, sizeof in->ip); 
this->ip [ sizeof this.ip -1] = 0; 
memcpy(this.ttl, ip->ttl, 2); 

UPDATE :이은 strncpy() 도움이 될 수있는이 드문 장소 중 하나입니다.