메시지를 주고받는 프로그램을 코딩했는데 recvfrom 함수 문제인지 메시지를 받지 못하고 있어요..
글쓴이: andra3623 / 작성시간: 수, 2010/10/13 - 3:21오후
소켓 프로그래밍에서
한쪽은 메시지를 보내기만 하고
한쪽은 받기만 하는 프로그램을 간단하게 구현했는데요
보내는 쪽은 잘 보내는것 같은데
받는 쪽은 전혀 못 받는것 같아요
메시지를 받아서 파일에 쓰고 싶은데
메시지를 받지 못하고 있어요..
리눅스 환경에서 UDP로 전송하고자 하는데
어떤것이 잘못되었는지 알려주세요~
좀 간단하면서도 어려운거 같아요..
부탁드립니다
메시지 전송만 하는 코드
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #define PORT 10501 #define BUFFSIZE 30 #define SEND_COUND 1000; void error_handling(char *message); struct message_packet { long packetCnt; char messageStr[]; }; int main(int argc, char **argv) { FILE* file; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int server_socket; int client_socket; struct message_packet meg; int iSockOpt; server_socket = socket( PF_INET, SOCK_DGRAM, 0 ); if( server_socket == -1 ) error_handling( "UDP Socket ERROR!"); memset( &server_addr, 0, sizeof(server_socket) ); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr( "192.168.0.2" ); server_addr.sin_port = htons( PORT ); //prevent bind error iSockOpt = 1; setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &iSockOpt, sizeof(iSockOpt)); if( bind( server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr) ) == -1 ) error_handling( "Bind ERROR!!" ); meg.packetCnt = 0; sprintf(meg.messageStr, "Hello world"); file = fopen( "fir_send.txt", "w"); while(1) { if( meg.packetCnt >= 10 ) break; meg.packetCnt++; sendto( server_socket, (char*)&meg, sizeof(meg), 0, (struct sockaddr*)&server_addr, sizeof(server_addr) ); fprintf( file, "[#%2d] %s\n", meg.packetCnt, meg.messageStr ); } fclose(file); close(server_socket); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
메시지 수신만 하는 코드
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #define BUFFSIZE 1020 #define PORT 10502 void error_handling(char *message); struct message_packet { long packetCnt; char message[BUFFSIZE]; }; int main(int argc, char **argv) { FILE* file; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int server_socket; int client_socket; struct message_packet meg; int str_len; int client_size; int iSockOpt; client_socket = socket( PF_INET, SOCK_DGRAM, 0); if( client_socket == -1) error_handling("UDP Socket ERROR!"); memset( &client_addr, 0, sizeof(client_socket) ); client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = inet_addr( "192.168.0.1" ); client_addr.sin_port = htons( PORT ); //prevent bind error iSockOpt = 1; setsockopt(client_socket, SOL_SOCKET, SO_REUSEADDR, &iSockOpt, sizeof(iSockOpt)); if( bind( client_socket, (struct sockaddr*)&client_addr, sizeof(client_addr) ) == -1 ) error_handling("Bind ERROR!"); file = fopen("recv.txt", "w"); while(1) { client_size = sizeof(client_addr); str_len = recvfrom( client_socket, (char*)&meg, sizeof(meg), 0, (struct sockaddr*)&client_addr, &client_size ); fprintf( file, "[#%2d] %s\n", meg.packetCnt, meg.message ); } fclose( file ); close( client_socket ); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
Forums:
얼핏 보기에
얼핏 보기에 아이피와 포트가 서로 다르네요..?
------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.
서로 다른 컴퓨터에서 동작하는거라서요
서로 다른 컴퓨터에서 동작하는거라서요
포트는 모르겠지만 아이피는 달라야 해요...
그 외에는 문제가 없나요??
10502로 열고
192.168.0.1:10502로 열고 기다리는데 192.168.0.2:10501로 쏘면 당연히 안가겠죠.
송신만 하는데서 지정하는 아이피:포트는 내꺼가 아니라 상대편거에요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
다른 문제로... (32bit
다른 문제로...
(32bit 환경에서라면)
받는 놈은 1024 바이트씩 열번 오기를 기대하는데,
보내는 놈은 4 byte 씩 열번 보내고 만다는 문제가 있죠.
OTL
meg가 포인터가
meg가 포인터가 아니라서 보내는 사이즈는 sizeof(meg)는 실제 structure의 사이즈가 될 것 같긴해요.
대신 endian을 고려하지 않아서 endian이 안 맞는 머신에서는 문제가 생길 여지가 있겠네요.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
글에 썼다시피, 받는
글에 썼다시피,
받는 놈은 말씀하신대로지만 보내는 놈은 그렇지 않습니다.
OTL
댓글 달기