UDP 通讯

// 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;
}


原文地址:https://www.cnblogs.com/javawebsoa/p/2978331.html