UDP 소켓통신의 BroadCasting 문제

shiny의 이미지

제가 UDP Broadcasting 프로그램을 짜고 있는데여.
제가 원하는건 서버쪽에서 클라이언트로 데이터를 보내고 싶은데 서버는 클라이언트의 IP주소를 모릅니다.
물론 같은 네크웍이구여.
Broadcasting을 하고싶어요. 서버와 클라이언트가 connect되지 않더라도
서버에서는 일방적으로 보내는 방법은 없나요?
뜻대로 잘 되지 않내요.
소스 한번 봐주세요.

/* socket header file */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>	/* AF_INET socket */
#include <netdb.h>

#define UDPPORT		2001	/* UDP PORT number */
	
main()
{
	int serverLen;	/* address struct length */
	int serverFd;	/* server socket */
	struct sockaddr_in serverINETAddress;	/* server INET address */
	struct sockaddr* serverSockAddrPtr;	/* server adress pointer */
	char udp_buf[] = "testing..";
	
	
	serverLen = sizeof(struct sockaddr); /* struct length */	
	serverSockAddrPtr = (struct sockaddr *)&serverINETAddress;

	serverINETAddress.sin_family = AF_INET;      /* host byte order */
	serverINETAddress.sin_port = htons(UDPPORT);  /* short, network byte order */
	serverINETAddress.sin_addr.s_addr = INADDR_BROADCAST; /* BROADCAST */
	bzero(&(serverINETAddress.sin_zero),8);

	if ((serverFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
	{
        	perror("socket");
         	exit(1);
	}
	setsockopt(serverFd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)); /* BROADCAST */

	if ((numbytes=sendto(serverFd, udp_buf, strlen(udp_buf),0, serverSockAddrPtr, serverLen)) == -1) 
	{
		perror("sendto");
       		exit(1);
    	}
	else
	{
		printf("UDP로 전송된 데이터[BYTE]:%s[%d]\n\r", udp_buf, numbytes);
		udp_buf[0]='\0';
	}

	close(serverFd);
}

이 프로그램을 실해시키면 'sendto: Network is unreachable'에러가 납니다..
'serverINETAddress.sin_addr.s_addr'에 inet_addr(255.255.255.255) 나
inet_addr(192.168.0.255) 를 주어도 같은 에러가 납니다.
htonl(INDDR_ANY) 값을 주면 서버쪽은 데이터를 잘 주는거 같은데 클라이언트쪽에서 네트워크 모니터링하면 아무것도 나타나지 않습니다
특정 IP를 설정하면 잘 되거든여.....
좋은 답변 부탁드립니다..

dyks의 이미지

setsockopt 할때 argument로 들어가는 opt 값은 TRUE로 주셨나요? (setsockopt 결과 확인도 하셨으면 좋겠는데.)

shiny의 이미지

...

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

shiny의 이미지

opt값은 true로 설정해줬구여.. setsocket값은

데시말론 -24724 헥사론 4가 나오네여..

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

shiny의 이미지

답변부탁드려요~ ㅠㅠ

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

liongo의 이미지

참고만 하시라고 적습니다..

AIX , CC 용이네요 컴파일은 안해봤지만

살짝보니 참고가 될거같아서 올려 봅니다...

http://www.developer.ibm.com/tech/sampaix.html

p.s 요샌 주로 아는것보다 구굴선생한테 물어봐서 올리는 답변이
많아지는군요 ㅡㅡa 우리 모두들 질문전에 구굴검색 -> 게시판검색
하고 올리는.. 습관을..

아참 그리고 너무 오래된 기억이라 가물거리는데.. 아마?
브로드케스트를 사용하려면 root권한이 필요했던가 싶습니다..
틀렸으면 바로 지적해주십시요.. ㅡㅡa 자신감이 떨어지는군요..

' 형식이 내용을 규정한다. '

shiny의 이미지

root권한이요??
첨 듣는건데 조금 더 자세히 설명해 주실수 있나요??
아무리 이것저것해봐도 안되는 것이
이 문제일수 도 있을 듯 싶네여...

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

shiny의 이미지

setsockopt 함수에서 IP_BROADCAST_IF 옵션은 머져??

컴파일하니 선언되지 않았다구 에러나드라구여..

찾아봐도 이 옵션에 대한 설명을 언급되 있지 않네요..

아시는 분 답변 좀 부탁드립니다.

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

alwaysN00b의 이미지

..

언제나 시작

pynoos의 이미지

이거 아직도 해결 못하셨나요?

제가 보기엔 처음 올린 코드에 문제가 없어 보이는데..

물론 컴파일해봤는데, 변수 두개가 선언안된거 말고는... 이상없습니다.

opt, numbytes

shiny의 이미지

제가 봤을때도 별 문제가 없을듯 싶은데...ㅠ,.ㅠ;;

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

urmajest의 이미지

224.0.0.1로 destination address를 지정해서 해보시겠어요?

여러 플랫폼(OS)에서 ping을 broadcast해보면 알겠지만..

그리고 TCP/IP illustrated vol 1. 에도 나와있는데,

implementation에 따라서 이상하게 동작하는 경우가 꽤나 많더군요

subnet-directed, net-directed 그리고 255.255.255.255로 해보시고,

안되면 224.0.0.1로 multicast를 이용해보세요

그럼..

shiny의 이미지

아무래도 처음부터 천천히 다시 생각해봐야 될것 같네요.

문제가 없는듯 싶은데.....ㅠㅠ

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

mach의 이미지

질의와 응답을 보다보니 현재 소스와
처음 올린소스는 다소 차이가 나는듯하군요.
소스를 다시 올려주시고요.

플랫폼도 명시를 해주시지요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

불량청년의 이미지

관계가 없을지도 모르겠지만,

ifconfig 명령 내리시고

eth0에 UP BROADCAST라고 나오는지 확인해 보세요.

환경에 따라서 지원 유/무가 다를 수도 있다고 어디선가

들은거 같은데... ㅡ,.ㅡ;

H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!

shiny의 이미지

eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:05
          inet addr:192.168.0.197  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:7 Base address:0x300

이렇게 나오는 군여..... UP BROADCAST가 있는것을 보니
지원하는게 아닐까여??

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

deathrow의 이미지

음...전 해보니까..잘되는데요...ㅡ.ㅡ
opt값을 1로 설정해 놓고,
Linux 2.4.20-8에서 GCC로 컴파일 해서 해보니까..
정상적으로 잘되는거 같네요..
패킷을 Ethernet 상에서 잡아서 확인해 봤는데.
Destination IP 255.255.255.255로 해서 잘 되네요..
(참고로 루트 권한으로 안하고, 그냥 일반 유저로 했습니다.)

==============================
= Crazy Fighter : Kill Them All =
==============================

shiny의 이미지

그럼 테스트 하셨던 서버, 클라이언트 프로그램좀 올려주실수 없나여??

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

deathrow의 이미지

위에 올려진 코드를 그대로 컴파일 해서 올렸습니다.
단지 setsocketopt()에서 사용한 opt변수의 값을 1로 설정만 해줬죠....
Client/Server로 확인 한 것은 아니고, 그냥 UDP Broadcast 패킷이 정상적으로 발생하는지만 Ethernet 상에서 Packet Capturing해보았습니다.

==============================
= Crazy Fighter : Kill Them All =
==============================

shiny의 이미지

저두 똑같이 테스트 했었는데 안되더라구여
아피를 255.255.255.255로하면 연결이 안되던데여??

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

shiny의 이미지

여러가지 테스트를 해봤습니다.

1. serverINETAddress.sin_addr.s_addr = inet_addr("192.168.0.255");
증상 : 정상

2. serverINETAddress.sin_addr.s_addr = inet_addr("255.255.255.255");
증상 : sendto : Network is unreachable, 프로그램 종료.

3. serverINETAddress.sin_addr.s_addr = htonl(INADDR_BROADCAST);
증상 : sendto : Network is unreachable, 프로그램 종료.

4. serverINETAddress.sin_addr.s_addr = htonl(INADDR_ANY);
증상 : 에러는 발생하지 않으나 서버에서 데이터를 수신하지 못함.

두번째나 세번째 방법으로 하고픈데....역시나 안되네여..
혹시 허브문제일 수도 있나여? 어디선가 살짝듣긴 했는데
정확힌 잘 모르겠네요. 검토 좀 해주세여~

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

케인의 이미지

INADDR_BROADCAST(=255.255.255.255)는 모든 인터페이스로 보내지는 않더군요. 혹시 장치가 여러 개 있지는 않나요? 어느 쪽으로 보내야 할지 시스템이 혼동할 수도 있습니다. 보통은 eth0로 보낼텐데 이상하네요.

shiny의 이미지

그럼 수신측에 eth0, eth1 두개가 있다면 eth1쪽은 수신하지 못한다는 말씀이십니까?
그럼 장치를 어떻게 선택해 줘야져?

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

unixian의 이미지

인터페이스가 기본적으로 eth0 이라 별로 생각 안하는 부분이지만

다중 인터페이스에선 꼭 생각해줘야 합니다.

UNP에 보면 인터페이스 선택에 대해서 잘다루니까 참조해 보세요.

나는 두 발을 묶고 자유를 얻었다...

익명 사용자의 이미지

serverINETAddress.sin_family = AF_INET; /* host byte order */
serverINETAddress.sin_port = htons(UDPPORT); /* short, network byte order */
serverINETAddress.sin_addr.s_addr = INADDR_BROADCAST; /* BROADCAST */

bzero(&(serverINETAddress.sin_zero),8);

기껏 값을 설정하고 bzero로 클리어시켜버렸으니 될리가 없읍니다. bzero를 지우던가.. 앞쪽으로 빼세요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.