为什么这段代码得不到我想要的结果?(UDP广播通讯)
代码如下:(摘抄于网络)
// SEND Segment#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<winsock2.h>#include<windows.h>#pragma comment(lib,"ws2_32.lib")void main(void){ SOCKET s; sockaddr_in addrto; WSADATA wsdata; BOOL bsocket; char *smsg="TEST MESSAGE"; WSAStartup(0x0202,&wsdata); s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED); bsocket=TRUE; //然后赋值给地址,用来从网络上的广播地址接收消息; addrto.sin_family=AF_INET; addrto.sin_addr.s_addr=INADDR_BROADCAST; addrto.sin_port=htons(5050); bool opt=true; //设置该套接字为广播类型, setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt)); int nlen=sizeof(addrto); while(1) { Sleep(1000); //从广播地址发送消息 int ret=sendto(s,smsg,256,0,(sockaddr*)&addrto,nlen); if(ret==SOCKET_ERROR) { printf("GetLastError: %d",WSAGetLastError()); } else { printf("ok"); } }}-----------------------// Recv segmentvoid main(void){ SOCKET s; sockaddr_in from,a; WSADATA wsdata; BOOL optval; //启动SOCKET库,版本为2.0 WSAStartup(0x0202,&wsdata); optval=TRUE; //然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息; a.sin_family=AF_INET; a.sin_addr.s_addr=0; a.sin_port=htons(5050); from.sin_family=AF_INET; from.sin_addr.s_addr=INADDR_BROADCAST; from.sin_port=htons(5050); int fromlength=sizeof(SOCKADDR); s=socket(AF_INET,SOCK_DGRAM,0); //设置该套接字为广播类型, setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval)); bind(s,(sockaddr *)&a,sizeof(sockaddr_in)); char buf[256]; while(1) {//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的 recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength); Sleep(2000); printf("%s\r\n",inet_ntoa(from.sin_addr)); //在此处输出检查到的IP,对吗???? ZeroMemory(buf,256); }//server#include "stdafx.h"#include "winsock2.h"#include "ws2tcpip.h"#include "windows.h"#define MULTICAST_ADDR "224.10.10.88"#define MULTICAST_PORT 6000#define LOCAL_PORT 8000int _tmain(int argc, _TCHAR* argv[]){ WSAData wdata; SOCKET s,sm; char buf[100]; SOCKADDR_IN localaddr,removeaddr; int opval,iport = MULTICAST_PORT; if(WSAStartup(MAKEWORD(2,2), &wdata) != 0) { printf("error:can not support winsocket 2\r\n"); return 0; } s = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_MULTIPOINT_C_LEAF); if(s == INVALID_SOCKET) { printf("create socket failed\r\n"); closesocket(s); WSACleanup(); return 0; } localaddr.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1"); localaddr.sin_family = AF_INET; localaddr.sin_port = htons(LOCAL_PORT); if(bind(s, (SOCKADDR *)&localaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){ printf("bind error\r\n"); closesocket(s); WSACleanup(); return 0; } opval = 8; if(setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&opval, sizeof(int)) == SOCKET_ERROR) { printf("setsockopt error\r\n"); closesocket(s); WSACleanup(); return 0; } removeaddr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR); removeaddr.sin_family = AF_INET; removeaddr.sin_port = htons(iport); sm = WSAJoinLeaf(s,(SOCKADDR*)&removeaddr,sizeof(SOCKADDR_IN), NULL, NULL, NULL, NULL, JL_BOTH); if(sm == INVALID_SOCKET) { printf("WSAJoinLeaf error\r\n"); closesocket(s); WSACleanup(); return 0; } while(1) { GetTimeFormat(NULL, 0, NULL, NULL, (LPTSTR)buf, 100); if(sendto(sm, buf, strlen(buf), 0, (SOCKADDR*)&removeaddr, sizeof(SOCKADDR)) == SOCKET_ERROR ) { printf("send data error\r\n"); closesocket(sm); closesocket(s); WSACleanup(); return 0; } printf("%s\r\n",buf); Sleep(1000); } return 0;}///////////////////////client#include "stdafx.h"#include "winsock2.h"#include "ws2tcpip.h"#include "windows.h"#define MULTICAST_ADDR "224.10.10.88"#define MULTICAST_PORT 6001#define LOCAL_PORT 6000int _tmain(int argc, _TCHAR* argv[]){ WSAData wdata; SOCKET s,sm; char buf[100]; SOCKADDR_IN localaddr,removeaddr; int opval,iport = MULTICAST_PORT; if(WSAStartup(MAKEWORD(2,2), &wdata) != 0) { printf("error:can not support winsocket 2\r\n"); return 0; } s = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_D_LEAF | WSA_FLAG_MULTIPOINT_C_LEAF); if(s == INVALID_SOCKET) { printf("create socket failed\r\n"); closesocket(s); WSACleanup(); return 0; } localaddr.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1"); localaddr.sin_family = AF_INET; localaddr.sin_port = htons(LOCAL_PORT); if(bind(s, (SOCKADDR *)&localaddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){ printf("bind error\r\n"); closesocket(s); WSACleanup(); return 0; } opval = 8; if(setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&opval, sizeof(int)) == SOCKET_ERROR) { printf("setsockopt error\r\n"); closesocket(s); WSACleanup(); return 0; } removeaddr.sin_addr.s_addr = inet_addr(MULTICAST_ADDR); removeaddr.sin_family = AF_INET; removeaddr.sin_port = htons(iport); sm = WSAJoinLeaf(s,(SOCKADDR*)&removeaddr,sizeof(SOCKADDR_IN), NULL, NULL, NULL, NULL, JL_BOTH); if(sm == INVALID_SOCKET) { printf("WSAJoinLeaf error\r\n"); closesocket(s); WSACleanup(); return 0; } while(1) { memset(buf, 0, 100); opval = sizeof(SOCKADDR); memset(&removeaddr, 0, sizeof(SOCKADDR_IN)); if(recvfrom(sm, buf, 100, 0, (SOCKADDR*)&removeaddr, &opval) == SOCKET_ERROR ) { printf("send data error\r\n"); closesocket(sm); closesocket(s); WSACleanup(); return 0; } printf("%s\r\n",buf); } closesocket(sm); closesocket(s); WSACleanup(); return 0;}
[解决办法]
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050);
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);
变成
a.sin_family=AF_INET;
a.sin_addr.s_addr=INADDR_BROADCAST;
a.sin_port=htons(5050);
from 是用来接收的 不用赋值
[解决办法]