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