udp 브로드케스트 수신이 안됩니다.

wataka의 이미지

리눅스(우분투, openwrt)에서udp 브로드케스트 수신이안됩니다

송신을 잘 되는대 수신만 안됩니다.

iptraf로 확인해보면 패킷은 잘 들어옵니다.

왜 그럴까요?

소스코드 안바꾸고 윈도우 콘솔로 옮겨서 실행하면 잘만됩니다 -_-;;;;

아래는 제가 짠 소스이고 대학교 수업시간떄 사용했던 브로드캐스트 예제(윈도우/리눅스 다있음)도 사용해보면

리눅스에서 송신한 브로드캐스트를 윈도우에서 잘 받는대

리눅스나 윈도우에서 송신한 브로드 캐스트를 윈도우에서 받질 못합니다.

netstat로 확인해봐도 0.0.0.0:포트 로 열려있고

ipconfig로 확인해도 Up braodcast로 되있는대

왜이럴까요? .....

윈도우버젼(잘됨)====================================================================================================================================

#include
#include
#include
#include

int main(int argc, char **argv){
char buffer[10];
int recv_sock=0;
struct sockaddr_in recv_addr;
int len = sizeof(recv_addr);
int bind_result;
int recv_result;
int opt=1;
struct sockaddr_in send_addr;
int send_len;

WSADATA wsa;
send_len=sizeof(send_addr);


WSAStartup(MAKEWORD(2, 2), &wsa);
/*
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
recv_addr.sin_port=htons(7085);
recv_addr.sin_family=AF_INET;

recv_sock = (int)socket(PF_INET, SOCK_DGRAM, 0);
if(recv_sock<0)
printf("sock open error\n");
if (setsockopt(recv_sock, SOL_SOCKET, SO_REUSEADDR, // 포트번호 재사용
(const char *)&opt, sizeof(int)) < 0)
printf("setsockopt_error\n");
// 수신용 포트번호를 설정함
if (bind(recv_sock, (struct sockaddr *)&recv_addr, sizeof(recv_addr)) < 0)
printf("bind_error\n");
*/

//bzero(&recv_addr, sizeof(recv_addr));

//recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
recv_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(recv_sock<0){
printf("sock open error\n");
}

//recv_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
recv_addr.sin_port=htons(7085);
recv_addr.sin_family=AF_INET;

//bind(recv_sock, (struct sockaddr *)&recv_addr, sizeof(recv_sock));

if(setsockopt(recv_sock, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt))<0)
printf("setsockopt_error\n");

if(bind(recv_sock, (struct sockaddr *)&recv_addr, sizeof(recv_addr))<0)
printf("bind_error\n");

//if((setsockopt(recv_sock,SOL_SOCKET,SO_BROADCAST, &opt,sizeof(opt)))) {
// printf("setsockopt error\n");
//}

while(1){
printf("recvfrom...\n");
recv_result=recvfrom(recv_sock, buffer, 10, 0, (struct sockaddr *)&recv_addr, &send_len);
if(recv_result<0){
printf("recv error \n");
exit(1);
}else{
printf("recv: %s\n", buffer);
}

}

WSACleanup();
return 0;

}

리눅스버젼(안됨)====================================================================================================================================

#include
#include
#include
#include
#include
#include
#include
#include
#include

int main(int argc, char **argv){
char buffer[10];
int recv_sock=0;
struct sockaddr_in recv_addr;
socklen_t len = sizeof(recv_addr);
int bind_result;
int recv_result;
int opt=1;
struct sockaddr_in send_addr;
socklen_t send_len;
send_len=sizeof(send_addr);

bzero(&recv_addr, sizeof(recv_addr));

recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
//recv_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(recv_sock<0){
printf("sock open error\n");
}

//recv_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
recv_addr.sin_port=htons(7085);
recv_addr.sin_family=AF_INET;

//bind(recv_sock, (struct sockaddr *)&recv_addr, sizeof(recv_sock));

if(setsockopt(recv_sock, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt))<0)
printf("setsockopt_error\n");

if(bind(recv_sock, (struct sockaddr *)&recv_addr, sizeof(recv_addr))<0)
printf("bind_error\n");

//if((setsockopt(recv_sock,SOL_SOCKET,SO_BROADCAST, &opt,sizeof(opt)))) {
// printf("setsockopt error\n");
//}

while(1){
printf("recvfrom...\n");
recv_result=recvfrom(recv_sock, buffer, 10, 0, (struct sockaddr *)&recv_addr, &send_len);
if(recv_result<0){
printf("recv error \n");
exit(1);
}else{
printf("recv: %s\n", buffer);
}

}
return 0;

}

댓글 달기

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