udp 브로드케스트 수신이 안됩니다.
리눅스(우분투, 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;
}
댓글 달기