[問題] UDP指定IP接收封包

看板C_and_CPP (C/C++)作者 (LALALA)時間12年前 (2014/05/14 10:09), 編輯推噓3(302)
留言5則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Windows VC++ Linux GCC 問題(Question): 能否建立一UDP連線, 可以接收指定IP的封包 我嘗試Windows的寫法, 也試過Linux的寫法, 但一直都沒有辦法做到. 程式碼(Code):(請善用置底文網頁, 記得排版) [Windows Code] 來源 http://ppt.cc/Gwcj SOCKET RecvSocket; unsigned short Port = 27015; sockaddr_in RecvAddr; RecvSocket = socket(AF_INET, SOCK_DGRAM, 0); if (RecvSocket == INVALID_SOCKET) { wprintf(L"socket error %d\n", WSAGetLastError()); return 1; } RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(Port); RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); iResult = bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof (RecvAddr)); if (iResult != 0) { wprintf(L"bind error %d\n", WSAGetLastError()); return 1; } ... 若紅色的地方換成下面 RecvAddr.sin_addr.s_addr = inet_addr("192.168.107.100"); 則會印出黃色的部份 bind error 10049 問題1: 這邊為什麼會出現這種錯誤? 是不能bind這種ip嗎? [Linux Code] struct sockaddr_in RecvAddr; struct sockaddr_in CliAddr; int lenCli = sizeof(CliAddr); int len; char buffer[4096]; int sock = socket(AF_INET, SOCK_DGRAM, 0); RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(Port); RecvAddr.sin_addr.s_addr = inet_addr("192.168.107.100"); int rc = bind(sock, (struct sockaddr*)&RecvAddr, sizeof(RecvAddr)); if(rc < 0) { perror("bind error:"); return 0; } memset(&CliAddr, 0, sizeof(CliAddr)); len = recvfrom(sock, buffer, 4096, 0, (struct sockaddr*)&Cliaddr, &lenCli); if(len < 0) { perror("recvfrom error:"); return len; } .... 問題2: 如果紅色的部份是 RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); 可以收到封包, 但如果如紅色那樣子指定IP後, 就收不到封包了, 請教各位大大, 究竟要如何用才能讓UDP接收指定IP的封包? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.28.113 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400033354.A.0E8.html

05/15 10:50, , 1F
bind要自己網卡ip;請改用raw socket自己濾吧
05/15 10:50, 1F

05/15 10:59, , 2F
所以UDP不能指定IP來接收, 但tcp可以對嗎?
05/15 10:59, 2F

05/16 11:54, , 3F
recefrom好像可以拿到client的ip
05/16 11:54, 3F

05/16 16:19, , 4F
TCP 可從 accept() 後判斷,UDP 在 recvfrom() 之後判斷
05/16 16:19, 4F

05/16 16:20, , 5F
printf("Client: %s\n", inet_ntoa(Cliaddr.sin_addr));
05/16 16:20, 5F
文章代碼(AID): #1JSj1A3e (C_and_CPP)
文章代碼(AID): #1JSj1A3e (C_and_CPP)