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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章