2016-08-18 2 views
0

처음으로 UDP를 코딩하기위한 준비에서 클라이언트 및 서버 코드 예제를 복사하고 가볍게 수정하여 here에서 수정했습니다. recvfrom()에 의해 반환 된 값이 읽은 바이트 수 대신 항상 버퍼의 크기라는 점을 제외하고는 모든 것이 작동하는 것처럼 보입니다. (버퍼 크기를 변경하고 다시 컴파일하면보고 된 바이트가 새로운 버퍼 크기와 일치하도록 변경 사항을 받았습니다. 전송 된 바이트는 모든 테스트에서 동일한 10 바이트입니다).recvfrom()은 바이트 수 대신 버퍼의 크기를 반환합니다.

누구든지이 코드에서 문제를 설명 할 수있는 오류를 발견합니까 (일부 오류 검사는 간결성을 위해 여기에서 제거되었습니다)? 이 관련이 경우, 나는 컴파일 및 맥북 프로 실행 요세미티 10.10.5의 터미널 창에서 bash는 실행 해요 :

#include <stdlib.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <unistd.h> 

#define BUFLEN 1024 
#define PORT 9930 

int main(void) { 
    struct sockaddr_in si_me, si_other; 
    int s, i, slen=sizeof(si_other); 
    int nrecv; 
    char buf[BUFLEN]; 

    s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    memset((char *) &si_me, 0, sizeof(si_me)); 
    si_me.sin_family = AF_INET; 
    si_me.sin_port = htons(PORT); 
    si_me.sin_addr.s_addr = htonl(INADDR_ANY); 
    bind(s, &si_me, sizeof(si_me)); 

    while (1) { 
    nrecv = recvfrom(s, buf, BUFLEN, 0, &si_other, &slen); 
    printf("Received packet from %s:%d\n%d bytes rec'd\n\n", 
      inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), nrecv); 
    } 
} 

답변

1

recvfrom는 버퍼의 크기로 데이터 그램을 잘라 버퍼가 충분하지 않은 경우 .

recvfrom이 버퍼 크기를 반환한다는 사실은 버퍼 크기가 충분히 크지 않다는 것을 의미합니다. 최대 이론적 UDP 데이터 그램 크기 인 65535 바이트로 늘리십시오.

+0

아! 나는 클라이언트 코드를 신중하게 검토하는 것을 게을리하지 않았다. 내 목표는 실제로 작업중인 안드로이드 장치에서 나오는 데이터를 현장에 보내는 간단한 작업 서버를 갖추는 것이었다. 내가 사용한 클라이언트 예제는 내가 잘못 가정 한 짧은 메시지 문자열뿐만 아니라 전체 버퍼를 전송합니다. 이 잘못된 가정과 클라이언트 버퍼와 같거나 작은 서버 버퍼 크기 만 테스트 한 사실로 인해 문제가있는 위치에 대한 잘못된 결론을 내게되었습니다 ... 가장 자주 발생하는 문제는 내 귀 사이였습니다. ! ;) 당신의 도움을 주셔서 감사합니다! – GISmatters

관련 문제