相比TCP,UDP的優點是傳輸速度快且能對整個網路廣播資料。但我以前在使用UDP整個網路廣播資料的用法上,一直沒能好好使用。這段時間,正好需要使用UDP的這個功能,因此經過摸索,得出了一種使用方法如下:(不一定是最好的,但能實現我的功能)
// 伺服器端<br />// Server.cpp : Defines the entry point for the console application.<br />//</p><p>#include "stdafx.h"<br />#include <WinSock2.h><br />#include <stdio.h><br />#include <iostream><br />using namespace std;</p><p>#pragma comment(lib, "ws2_32.lib")</p><p>const int MAX_BUF_LEN = 255;</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />WORD wVersionRequested;<br />WSADATA wsaData;<br />int err;</p><p>// 啟動socket api<br />wVersionRequested = MAKEWORD( 2, 2 );<br />err = WSAStartup( wVersionRequested, &wsaData );<br />if ( err != 0 )<br />{<br />return -1;<br />}</p><p>if ( LOBYTE( wsaData.wVersion ) != 2 ||<br />HIBYTE( wsaData.wVersion ) != 2 )<br />{<br />WSACleanup( );<br />return -1;<br />}</p><p>// 建立socket<br />SOCKET connect_socket;<br />connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);<br />if(INVALID_SOCKET == connect_socket)<br />{<br />err = WSAGetLastError();<br />printf("/"socket/" error! error code is %d/n", err);<br />return -1;<br />}</p><p>SOCKADDR_IN sin;<br />sin.sin_family = AF_INET;<br />sin.sin_port = htons(3779);<br />sin.sin_addr.s_addr = INADDR_BROADCAST;</p><p>bool bOpt = true;<br />//設定該通訊端為廣播類型<br />setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));</p><p>int nAddrLen = sizeof(SOCKADDR);</p><p>char buff[MAX_BUF_LEN] = "";<br />int nLoop = 0;<br />while(1)<br />{<br />nLoop++;<br />sprintf(buff, "%8d", nLoop);</p><p>// 發送資料<br />int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen);<br />if(SOCKET_ERROR == nSendSize)<br />{<br />err = WSAGetLastError();<br />printf("/"sendto/" error!, error code is %d/n", err);<br />return -1;<br />}<br />printf("Send: %s/n", buff);<br />Sleep(500);<br />}</p><p>return 0;<br />}</p><p>// 用戶端<br />// Client.cpp : Defines the entry point for the console application.<br />//</p><p>#include "stdafx.h"<br />#include <WinSock2.h><br />#include <stdio.h></p><p>#pragma comment(lib, "ws2_32.lib")</p><p>const int MAX_BUF_LEN = 255;</p><p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />WORD wVersionRequested;<br />WSADATA wsaData;<br />int err;</p><p>// 啟動socket api<br />wVersionRequested = MAKEWORD( 2, 2 );<br />err = WSAStartup( wVersionRequested, &wsaData );<br />if ( err != 0 )<br />{<br />return -1;<br />}</p><p>if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )<br />{<br />WSACleanup( );<br />return -1;<br />}</p><p>// 建立socket<br />SOCKET connect_socket;<br />connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);<br />if(INVALID_SOCKET == connect_socket)<br />{<br />err = WSAGetLastError();<br />printf("/"socket/" error! error code is %d/n", err);<br />return -1;<br />}</p><p>// 用來綁定通訊端<br />SOCKADDR_IN sin;<br />sin.sin_family = AF_INET;<br />sin.sin_port = htons(3779);<br />sin.sin_addr.s_addr = 0;</p><p>// 用來從網路上的廣播位址接收資料<br />SOCKADDR_IN sin_from;<br />sin_from.sin_family = AF_INET;<br />sin_from.sin_port = htons(3779);<br />sin_from.sin_addr.s_addr = INADDR_BROADCAST;</p><p>//設定該通訊端為廣播類型,<br />bool bOpt = true;<br />setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));</p><p>// 綁定通訊端<br />err = bind(connect_socket, (SOCKADDR*)&sin, sizeof(SOCKADDR));<br />if(SOCKET_ERROR == err)<br />{<br />err = WSAGetLastError();<br />printf("/"bind/" error! error code is %d/n", err);<br />return -1;<br />}</p><p>int nAddrLen = sizeof(SOCKADDR);<br />char buff[MAX_BUF_LEN] = "";<br />int nLoop = 0;<br />while(1)<br />{<br />// 接收資料<br />int nSendSize = recvfrom(connect_socket, buff, MAX_BUF_LEN, 0, (SOCKADDR*)&sin_from, &nAddrLen);<br />if(SOCKET_ERROR == nSendSize)<br />{<br />err = WSAGetLastError();<br />printf("/"recvfrom/" error! error code is %d/n", err);<br />return -1;<br />}<br />buff[nSendSize] = '/0';<br />printf("Recv: %s/n", buff);<br />}</p><p>return 0;<br />}</p><p>