네트워크 프로그래밍 브로드캐스팅하는 법

linuxs의 이미지

안녕하세요.. 소켓프로그램을 이용해서 로컬 호스트들에게(192.168.0.2 ~ 192.168.0.254) 특정 데이타를 보내려고 합니다. 각각의 호스트들은 이를 수신할 수 있도록 데몬을 만들려고 또한 데이타를 보낼수 있도록 하는 간단한 테스트 프로그램을 만들려고 합니다. 그냥 하나의 호스트에게 보내는건 돼는데 브로드캐스트 주소로 했더니 unreachable로 나오네요.

sockaddr_in 구조체 멤버인 sin_addr.s_addr에 192.168.0.255를 입력하였는데 브로드 캐스팅이 될 질 않내요..
제가 아주 원초적인 실수를 하는건가요?
192.168.0.1은 게이트웨어
192.168.0.255는 브로드캐스트 주소 아닌가요?
ifconfig에 보면 그렇게 나오는데 ...
그럼 도움 부탁드립니다.

madkoala의 이미지

브로드캐스트를 하실 때는.. 목적지 주소를 모두 255.255.255.255로 해주시면 됩니다.(이렇게 하면 모든 호스트에 대해서 브로드캐스팅이 날아가지 않느냐! 라고 하실지 모르지만 라우터가 자릅니다. 랄라~)

crimsoncream의 이미지

socket 생성시에 SOCK_STREAM으로 하신건 아닌지 socket optiont에서 SO_BROADCAST를 set 해주셨는지 체크해 보시고 broadcasting 주소는 INADDR_BROADCAST 마크로를 쓰시는게 더 좋을 것 같습니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

linuxs의 이미지

crimsoncream wrote:
socket 생성시에 SOCK_STREAM으로 하신건 아닌지 socket optiont에서 SO_BROADCAST를 set 해주셨는지 체크해 보시고 broadcasting 주소는 INADDR_BROADCAST 마크로를 쓰시는게 더 좋을 것 같습니다.

네 그래서 SOCK_STREAM으로 되어 있었습니다.
그래서 다음과 같이 아이피 주소와 SO_BROADCAST로 설정하였습니다. 그런데 이번에 죽지는 않는데 잘못된 파일 디스크립트라고 나오네요..
머가 문제인지..모르겠습니다. 수신하는 쪽은 어떻게 처리해야 되는지요?

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=INADDR_BROADCAST;
server_addr.sin_port=htons(ROUTER_PORT);

strcpy(uq_header.gid ,"BISGID");
strcpy(uq_header.uid, "shin");
uq_header.gpsxyz.x = 10;
uq_header.gpsxyz.y = 20;
uq_header.gpsxyz.z = 30;
uq_header.hoc_counter = 1;

sockfd=socket(AF_INET,SO_BROADCAST,0);
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
if((connect(sockfd, &server_addr, sizeof(server_addr))==-1))
{
perror("connect Fail");
}
if((sendbyte=send(sockfd,&uq_header,sizeof(uq_header),0))<0)
{
perror("rebroadcast Send Fail\n");
}
recv(sockfd,&ack,sizeof(ack),0);
printf("-------%s\n",ack);
close(sockfd);
sleep(1);

꿈은 이루어진다.

netj의 이미지

linuxs wrote:
네 그래서 SOCK_STREAM으로 되어 있었습니다.
그래서 다음과 같이 아이피 주소와 SO_BROADCAST로 설정하였습니다. 그런데 이번에 죽지는 않는데 잘못된 파일 디스크립트라고 나오네요..
머가 문제인지..모르겠습니다. 수신하는 쪽은 어떻게 처리해야 되는지요?

SOCK_STREAM(TCP) 소켓으로는 broadcast가 불가능합니다. UDP와는 달리 TCP는 어떻게든 1대1로 연결이 된 다음부터 통신을 할 수 있기 때문이죠.

linuxs wrote:
...
sockfd=socket(AF_INET,SO_BROADCAST,0);
...

SO_BROADCAST는 소켓 옵션이죠.. :( SOCK_DGRAM을 줘보세요.

crimsoncream의 이미지

sockfd=socket(AF_INET,SOCK_DGRAM,0); 

윗분 말씀대로 요렇게만 하시면 될 것 같군요.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

wooho47의 이미지

sDST = socket(AF_INET, SOCK_DGRAM, 0);

setsockopt(sDST, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

ip address 는
클래스별에 맞게 지정해주시는게 좋을듯 합니다.
C 클래스
x.x.x.255
B 클래스
x.x.255.255

hi 용

linuxs의 이미지

리눅서 여러분들 조언 감사드립니다.

#include "bis.h"


int sockfd;
struct sockaddr_in  server_addr;



static void client()
{
	int rc;
	int peerlen;
	struct UQ_HEADER uq_header;
	
	char ack[4]="";
	char buf[120];
	
	strcpy(uq_header.gid ,"BISGID");
	strcpy(uq_header.uid, "shin");
	uq_header.gps.x = 10;
	uq_header.gps.y = 20;
	uq_header.gps.z = 30;
	uq_header.hoc_counter = 1;


	peerlen = sizeof(server_addr);
	
	if((sendto(sockfd,&uq_header,sizeof(uq_header),0,&server_addr, &peerlen))<0)
		perror( "sendto Fail");
	rc = recvfrom (sockfd, ack, sizeof(ack), 0, &server_addr, &peerlen);
	if(rc>=0)
		write(1,ack,rc);
	else
		error(1,errno, "recvfrom Fail");
}

int main()

{
	struct timeval tv;
	int result;
	const int optValue;
	int sendbyte;
	const int opt;
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family=AF_INET;
	server_addr.sin_addr.s_addr=INADDR_BROADCAST;
	server_addr.sin_port=htons(ROUTER_PORT);

	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
	
	client();

	sleep(1);
	
	return (0);
}



컴파일은 돼는데 sendto에서 invalid argument라는 에러가 나는데 도무지 알수가 없네요?
&peerlen 로 하면 invalid argument
peerlen 로 하면 Permission denied
로 나오네요.
아래것로 하는게 맞는것 같은데..

꿈은 이루어진다.

익명 사용자의 이미지

sendto(sockfd,&uq_header,sizeof(uq_header),0,&server_addr, &peerlen)
마지막 인자인 &peerlen 대신에 sizeof (struct sockaddr_in)을 넣어줘보세요.

crimsoncream의 이미지

peerlen으로 하시고요.
사용하시는 포트가 1024 미만이 아닌지 확인해 보십시요.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

익명 사용자의 이미지

브로드캐스팅한 바로 그 장비에서 그 패킷을 잡으려고...

select 후에 readable 한 경우에 recvfrom 을 호출하게 해놨는데...
어찌된 일인지 3번을 select 하고 recvfrom 하네요 -_-;;;

혹시나 해서 다른 장비로 옮겨서 브로드캐스팅한 것을 잡아봤더니..
정상적으로 1번만 select 후에 recvfrom 합니다.

이거 왜 이런지 알려주실 분 계십니까 ?
왜 로컬에서는 한번 브로드캐스팅한 것을 3번이나 받죠?

미리 감사합니다.

댓글 달기

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