메시지를 주고받는 프로그램을 코딩했는데 recvfrom 함수 문제인지 메시지를 받지 못하고 있어요..

andra3623의 이미지

소켓 프로그래밍에서
한쪽은 메시지를 보내기만 하고
한쪽은 받기만 하는 프로그램을 간단하게 구현했는데요

보내는 쪽은 잘 보내는것 같은데
받는 쪽은 전혀 못 받는것 같아요
메시지를 받아서 파일에 쓰고 싶은데
메시지를 받지 못하고 있어요..

리눅스 환경에서 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);
}
nthroot의 이미지

얼핏 보기에 아이피와 포트가 서로 다르네요..?

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

andra3623의 이미지

서로 다른 컴퓨터에서 동작하는거라서요

포트는 모르겠지만 아이피는 달라야 해요...

그 외에는 문제가 없나요??

mithrandir의 이미지

192.168.0.1:10502로 열고 기다리는데 192.168.0.2:10501로 쏘면 당연히 안가겠죠.

송신만 하는데서 지정하는 아이피:포트는 내꺼가 아니라 상대편거에요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

bushi의 이미지

다른 문제로...
(32bit 환경에서라면)
받는 놈은 1024 바이트씩 열번 오기를 기대하는데,
보내는 놈은 4 byte 씩 열번 보내고 만다는 문제가 있죠.

OTL

mithrandir의 이미지

meg가 포인터가 아니라서 보내는 사이즈는 sizeof(meg)는 실제 structure의 사이즈가 될 것 같긴해요.
대신 endian을 고려하지 않아서 endian이 안 맞는 머신에서는 문제가 생길 여지가 있겠네요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

bushi의 이미지

글에 썼다시피,
받는 놈은 말씀하신대로지만 보내는 놈은 그렇지 않습니다.

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.