【转】C++ Socket UDP "Hello World!"

//////////////////////////////////////////////////////////////////////////
// UDPServer.cpp

#include <stdio.h>
#include <WINSOCK2.H>

#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE	64

int main(void)
{
	WSADATA	wsd;
	SOCKET	s;
	int		nRet;

	// 初始化套接字动态库
	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		printf("WSAStartup failed !\n");
		return 1;
	}

	// 创建套接字
	s = socket(AF_INET,SOCK_DGRAM,0);
	if(s == INVALID_SOCKET)
	{
		printf("socket() failed ,Error Code:%d\n",WSAGetLastError());
		WSACleanup();
		return 1;
	}

	SOCKET		socketSrv = socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	SOCKADDR_IN addrClient;
	char		buf[BUF_SIZE];
	int			len = sizeof(SOCKADDR);

	// 设置服务器地址
	ZeroMemory(buf,BUF_SIZE);
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(5000);

	// 绑定套接字
	nRet = bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	if(SOCKET_ERROR == nRet)   
    {   
        printf("bind failed !\n");   
        closesocket(s);   
        WSACleanup();   
        return -1;   
    }

	// 从客户端接收数据
	nRet = recvfrom(socketSrv,buf,BUF_SIZE,0,(SOCKADDR*)&addrClient,&len);
	if(SOCKET_ERROR == nRet)   
    {   
        printf("recvfrom failed !\n");   
        closesocket(s);   
        WSACleanup();   
        return -1;   
    }
	// 打印来自客户端发送来的数据
	printf("Recv From Client:%s\n",buf);

	// 向客户端发送数据
	sendto(socketSrv,"UDP Hello World !",sizeof("UDP Hello World !"),0,(SOCKADDR*)&addrClient,len);
	closesocket(s);
	WSACleanup();
	return 0;
}

//////////////////////////////////////////////////////////////////////////
// UDPClient.cpp

#include <stdio.h>
#include <WINSOCK2.H>

#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE	64

int main(void)
{
	WSADATA	wsd;	
	SOCKET	s;

	// 初始化套接字动态库
	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		printf("WSAStartup failed !\n");
		return 1;
	}

	// 创建套接字
	s = socket(AF_INET,SOCK_DGRAM,0);
	if(s == INVALID_SOCKET)
	{
		printf("socket() failed, Error Code:%d\n",WSAGetLastError());
		WSACleanup();
		return 1;
	}

	char		buf[BUF_SIZE];	// 接受数据
	SOCKADDR_IN	servAddr;		// 服务器套接字地址
	SOCKET		sockClient = socket(AF_INET,SOCK_DGRAM,0);
	int			nRet;

	ZeroMemory(buf,BUF_SIZE);
	strcpy(buf,"UDP Hello World !");

	// 设置服务器地址
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.254");
	servAddr.sin_port = htons(5000);

	// 向服务器发送数据
	int nServAddLen = sizeof(servAddr);
	if(sendto(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,nServAddLen) == SOCKET_ERROR)
	{
		printf("recvfrom() failed:%d\n",WSAGetLastError());
		closesocket(s);
		WSACleanup();
		return 1;
	}
	nRet = recvfrom(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,&nServAddLen);
	if(SOCKET_ERROR == nRet)   
    {   
        printf("recvfrom failed !\n");   
        closesocket(s);   
        WSACleanup();   
        return -1;   
    }

	// 打印来自服务端发送来的数据
	printf("Recv From Server:%s\n",buf);
	closesocket(s);
	WSACleanup();
	return 0;
}

posted @ 2010-11-29 13:45  天堂大鸟  阅读(5864)  评论(1编辑  收藏  举报