메시지를 주고받는 프로그램을 코딩했는데 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
댓글 달기