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