// Udp_20130322.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <WinSock2.h> #pragma comment(lib, "WS2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { CHAR szBuffer[100] = {"Hello UDP!"}; WSADATA wsaData; SOCKET udpSocket; SOCKADDR_IN SendAddr; SOCKADDR_IN RecvAddr; int iAddrLen = 0; int iErrorCode = 0; INT nNetTimeout = 1000*10; /* * 初始化SOCKET */ if (0 != WSAStartup(MAKEWORD(2,2), &wsaData)) { WSACleanup(); return 0; } /* * 创建用于发送数据的SOCKET */ udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (INVALID_SOCKET == udpSocket) { closesocket(udpSocket); WSACleanup(); return 0; } /* * 接收超时 */ iErrorCode = setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&nNetTimeout, sizeof(INT)); if (SOCKET_ERROR == iErrorCode) { closesocket(udpSocket); WSACleanup(); return 0; } /* * 绑定到自己的端口 */ RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(4000); RecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); iAddrLen = sizeof(RecvAddr); iErrorCode = bind(udpSocket, (SOCKADDR*)&RecvAddr, iAddrLen); /* * 设置要发送的IP地址及端口号 * 备注:如果在同一台机器上做测试时,自己的端口与服务器的端口不可以重复; * 如果重复会有一段打开端口失败。 */ SendAddr.sin_family = AF_INET; SendAddr.sin_port = htons(4000); SendAddr.sin_addr.S_un.S_addr = inet_addr("172.16.0.193"); /* * 发送请求,传入带有对方的地址信息的结构体 */ iErrorCode = sendto(udpSocket, szBuffer, strlen(szBuffer)+1, 0, (SOCKADDR*)&SendAddr, sizeof(SendAddr)); if (SOCKET_ERROR == iErrorCode) { closesocket(udpSocket); WSACleanup(); return 0; } /* * 接收请求,传入带有本地端口信息的结构体 */ iErrorCode = recvfrom(udpSocket, szBuffer, 100, 0, (SOCKADDR*)&RecvAddr, &iAddrLen); if (SOCKET_ERROR == iErrorCode) { closesocket(udpSocket); WSACleanup(); return 0; } printf(szBuffer); getchar(); closesocket(udpSocket); WSACleanup(); return 0; }