windows 下 c++ socket udp 广播

来源:互联网 发布:社交网络的发展现状 编辑:程序博客网 时间:2024/06/18 04:30

接收广播消息端:

[cpp] view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <WinSock2.h>  
  4.   
  5. #pragma  comment(lib, "ws2_32.lib")  
  6.   
  7. const int MAX_BUF_LEN = 255;  
  8.   
  9. using namespace std;  
  10.   
  11. int _tmain(int argc, _TCHAR* argv[])  
  12. {  
  13.     WORD wVersionRequested;  
  14.     WSADATA wsaData;  
  15.     int err;  
  16.   
  17.     wVersionRequested = MAKEWORD(2, 2);  
  18.     err = WSAStartup(wVersionRequested, &wsaData);  
  19.     if(err != 0)  
  20.     {  
  21.         return -1;  
  22.     }  
  23.     if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)  
  24.     {  
  25.         WSACleanup();  
  26.         return -1;  
  27.     }  
  28.       
  29.     SOCKET clientSock = socket(AF_INET, SOCK_DGRAM, 0);  
  30.     if (INVALID_SOCKET == clientSock)  
  31.     {  
  32.         err = WSAGetLastError();  
  33.         printf("socket error:%d\n", err);  
  34.         WSACleanup();  
  35.         return -1;  
  36.     }  
  37.     //创建本地地址信息并绑定  
  38.     SOCKADDR_IN sin;  
  39.     sin.sin_family = AF_INET;  
  40.     sin.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  41.     sin.sin_port = htons(7001);  
  42.     if (bind(clientSock, (SOCKADDR*)&sin, sizeof(sin)) != 0)  
  43.     {  
  44.         err = WSAGetLastError();  
  45.         printf("bind error:%d\n", err);  
  46.         closesocket(clientSock);  
  47.         WSACleanup();  
  48.         return -1;  
  49.     }  
  50.   
  51.     SOCKADDR_IN clientAddr;  
  52.     int addrLen = sizeof(clientAddr);  
  53.     int nSize;  
  54.     char recvBuff[1024];  
  55.     memset(recvBuff, 0, 1024);  
  56.   
  57.     while(1){  
  58.         nSize = recvfrom(clientSock, recvBuff, 1024, 0, (SOCKADDR*)&clientAddr,&addrLen);  
  59.         if ( nSize == SOCKET_ERROR)  
  60.         {  
  61.             err = WSAGetLastError();  
  62.             printf("recv error:%d\n", err);  
  63.             break;  
  64.         }  
  65.         recvBuff[nSize] = '\0';  
  66.         printf("%s\n", recvBuff);  
  67.   
  68.     }  
  69.       
  70.     closesocket(clientSock);  
  71.     WSACleanup();  
  72.     return 0;  
  73. }  

发送广播消息端:
[cpp] view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <stdio.h>  
  4. #include <WinSock2.h>  
  5.   
  6. #pragma comment(lib, "ws2_32.lib")  
  7.   
  8. using namespace std;  
  9.   
  10. const int MAX_BUF_LEN = 255;  
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14.     WORD wVersionRequested;  
  15.     WSADATA wasData;//指向WinSocket信息结构的指针  
  16.     int err;  
  17.   
  18.     wVersionRequested = MAKEWORD(2, 2);  
  19.     // 初始化winsock库,使用socket的前提  
  20.     err = WSAStartup(wVersionRequested, &wasData);  
  21.     if (err != 0)  
  22.     {  
  23.         return -1;  
  24.     }  
  25.     if (LOBYTE(wasData.wVersion) != 2 || HIBYTE(wasData.wVersion) != 2)  
  26.     {  
  27.         WSACleanup();  
  28.         return -1;  
  29.     }  
  30.     SOCKET conn_sock = socket(AF_INET, SOCK_DGRAM, 0);  
  31.     if (conn_sock == INVALID_SOCKET)  
  32.     {  
  33.         err = WSAGetLastError();  
  34.         printf("socket error:%d\n", err);  
  35.         closesocket(conn_sock);  
  36.         WSACleanup();  
  37.         return -1;  
  38.     }  
  39.     bool bOpt = true;  
  40.     //打开广播选项  
  41.     setsockopt(conn_sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  
  42.       
  43.     // 设置发往的地址  
  44.     SOCKADDR_IN saUdpServ;  
  45.     memset(&saUdpServ, 0, sizeof(saUdpServ));  
  46.     saUdpServ.sin_family = AF_INET;  
  47.     saUdpServ.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);  
  48.     saUdpServ.sin_port = htons(7001);  
  49.     int nSize = sizeof(SOCKADDR_IN);      
  50.       
  51.     char buff[MAX_BUF_LEN];  
  52.     memset(buff, 0, MAX_BUF_LEN);  
  53.     int nLoop = 0;  
  54.     char* ip = NULL;  
  55.     while(1){  
  56.         nLoop++;  
  57.         sprintf(buff, "Message %d", nLoop);  
  58.         int nSendSize = sendto(conn_sock, buff, strlen(buff), 0, (SOCKADDR*)&saUdpServ, nSize);  
  59.         if (nSendSize == SOCKET_ERROR)  
  60.         {  
  61.             err = WSAGetLastError();  
  62.             printf("sendto error:%d\n", err);  
  63.             closesocket(conn_sock);  
  64.             WSACleanup();  
  65.             return -1;  
  66.         }  
  67.         printf("send: %s\n", buff);  
  68.         Sleep(5000);  
  69.     }  
  70.       
  71.     closesocket(conn_sock);  
  72.     WSACleanup();  
  73.     return 0;  

原创粉丝点击