udp 통신 질문입니다.
글쓴이: 이기문 / 작성시간: 수, 2003/07/30 - 10:14오후
udp 통신 질문입니다.
이건 connection을 만드는 부분이구요..
void makeConnection(char* IPAddress) { if ((he=gethostbyname(IPAddress)) == NULL) { /* get the host info */ herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } their_addr.sin_family = AF_INET; /* host byte order */ their_addr.sin_port = htons(PORT); /* short, network byte order */ their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */ if ((numbytes=sendto(sockfd, "Are you ready?", strlen("Are you ready?"), 0, (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) { perror("sendto"); exit(1); } cerr << "sock fd: " << sockfd << endl; }
이건 클라이언트로 내가 필요한 내용을 보낼떄 호출하는 함수입니다.
void receiveFromClient() { if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, (struct sockaddr *)&their_addr, addr_len)) == -1) { perror("recvfrom"); exit(1); } buf[numbytes] = '\0'; fileSize = atol(buf); cout << "Received file size : " << fileSize << " bytes." << endl; int bytesReceived = 0; while (bytesReceived < fileSize) { if ((numbytes=recvfrom(sockfd, (char *)(&(buf[bytesReceived])), fileSize-bytesReceived, 0, (struct sockaddr *)&their_addr, addr_len)) == -1) { perror("recvfrom"); exit(1); } bytesReceived = bytesReceived + numbytes; } }
위의 두 함수를 작성하구요..
일단은 첫번째 함수를 불러서 client와의 connection을 만들어놓고..
전송할 내용이 있을떄 두번쨰 함수를 불러서 내용을 전송하고 싶습니다.
참고로
int sockfd; struct sockaddr_in their_addr; struct hostent *he; int numbytes; socklen_t* addr_len; char buf[MAXBUFLEN];
이런 녀석들은 모두 전역변수로 선언했습니다.
그런데..
보내려고 두번쨰 함수를 부르면 Bad address 하고 에러가 나는데요..
왜 그런지 조언 부탁드립니다.
감사합니다 ^^
Forums:
int recvfrom(int s, void *buf, size_t le
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
fromlen에 들어가는 인자가 일단 잘못 되었군요.
socklen_t* addr_len; 이런 식으로 전역변수로 ad
socklen_t* addr_len;
이런 식으로 전역변수로 addr_len을 선언했구요..
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
socklen_t *fromlen 에서 fromlen 자리에 addr_len을 넣었는데..
제가 아직 잘 몰라서.. 좀 더 자세한 설명 부탁드립니다. ^^
그리고.. 위에 두 함수를 붙여서 한개의 함수로 만들어서 하면 되거든요.
왜 그런지 잘 모르겠습니다.
조언 부탁드립니다.
감사합니다 ^^
fromlen..
fromlen은 포인터 타입이지만,
그렇다고 이 아규먼트가 특정 값을 리턴하기 위해서만 존재하는 아규먼트는 아닙니다.
man 페이지에도 약간의 언급이 있겠지만...
이 아규먼트에는 from 의 크기를 가지는 변수의 포인터가 넘어가야 하죠..
udp
죄송하지만 약간의 확인이 필요할거 같습니다.
혹시 지금 보여 주신부분이 server라는 과정아래에..
client부분에서 sendto로 전달된 메세지가 오는것을
확인은 하신것인지 궁금합니다..
제가 보기엔 sendto 자제도 메세지 전달을 하지 못했을거
같다는 생각에서 말씀을 드리는 것입니다.
혹시 확인 하시고 전달되었다면 제가 잘못 생각한것이겠지만
전달 되지 않았다면
이부분이 잘못된것 같다는 생각이 불현듯 들어서
말씀드립니다.
추가로
their_addr.sin_addr = (struct in_addr)inet_addr(he->h_addr);
또는their_addr.sin_addr.s_addr = inet_addr(he->h_addr);
이렇게 수정하시는게 맞지 않을까 합니다..
댓글 달기