UDP简单实现

本文提供了一个基于WinSock的UDP客户端与服务器通信的C++实现案例。该案例展示了如何使用多线程进行双向数据收发,并包含了错误处理及初始化步骤。通过此示例,读者可以了解到UDP通信的基本原理及其在Windows平台上的具体应用。
// UDPCLIENT.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>
#include <process.h>
using namespace std;
#pragma comment(lib,"WS2_32.lib")

SOCKET s;
SOCKADDR_IN servaddr;
SOCKADDR_IN clientaddr;
int len;
char buf[100];
void  rec(LPVOID p)
{
	while(1)
	{
		len = sizeof(servaddr);
		memset(buf,0,100);
		if(recvfrom(s,buf,100,0,(sockaddr*)&servaddr,&len) == SOCKET_ERROR)
		{
		}
		else
		{
			if(strcmp(buf,"") != 0)
			cout << "服务器:"  << buf << endl;
		}
		Sleep(100);
	}
}

void sed(LPVOID p)
{
	while(1)
	{
		memset(buf,0,100);
		cin >> buf;
		if(sendto(s,buf,strlen(buf),0,(sockaddr*)&servaddr,sizeof(SOCKADDR_IN)) == 0)
		{
			cout << "sendto error!" << endl;
		}
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsa;
	
	if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
	{
		cout << "wsastartup error!" << endl;
		return -1;
	}
	s = socket(AF_INET,SOCK_DGRAM,0);
	if(s == INVALID_SOCKET)
	{
		WSACleanup();
		cout << "s error!" << endl;
		return -1;
	}
	
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servaddr.sin_port = htons(5000);
	
  	if(bind(s,(sockaddr*)&servaddr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
  	{
  		cout << "bind error!" << endl;
  		closesocket(s);
  		WSACleanup();
  		return -1;
  	}

	
 	clientaddr.sin_family = AF_INET;
 	clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 	clientaddr.sin_port = htons(7000);
	
	_beginthread(sed,0,NULL);
	_beginthread(rec,0,NULL);
	while(1)
	{
		Sleep(1000);
	}
//	cout << buf << endl;
	closesocket(s);
	WSACleanup();
	return 0;
}

// UDPSEVER.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <iostream>
#include <process.h>
using namespace std;
#pragma comment(lib,"WS2_32.lib")
SOCKET s;
char buf[100];
SOCKADDR_IN clientaddr;
SOCKADDR_IN servaddr;
int len;

void sed(LPVOID p)
{
	while(1)
	{
		memset(buf,0,100);
		cin >> buf;
		if(sendto(s,buf,strlen(buf),0,(sockaddr*)&clientaddr,sizeof(SOCKADDR_IN)) == 0)
		{
			cout << "sendto error!" << endl;
			cout << GetLastError() << endl;
		}
	}
}

void  rec(LPVOID p)
{
	while(1)
	{
		len = sizeof(servaddr);
		memset(buf,0,100);
		if(recvfrom(s,buf,100,0,(sockaddr*)&clientaddr,&len) == SOCKET_ERROR)
		{
			
		}
		else
		{
			if(strcmp(buf,"") != 0)
				cout << "客户端:" << buf << endl;
		}
		Sleep(100);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsa;
	
	if(WSAStartup(MAKEWORD(2,2),&wsa) != 0)
	{
		cout << "wsastartup error!" << endl;
		return -1;
	}
	s = socket(AF_INET,SOCK_DGRAM,0);
	if(s == INVALID_SOCKET)
	{
		WSACleanup();
		cout << "s error!" << endl;
		return -1;
	}
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servaddr.sin_port = htons(7000);
	if(bind(s,(sockaddr*)&servaddr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
	{
		cout << "bind error!" << endl;
		closesocket(s);
		WSACleanup();
		return -1;
	}
	
 	clientaddr.sin_family = AF_INET;
 	clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
 	clientaddr.sin_port = htons((short)5000);
	
	_beginthread(sed,0,NULL);
	_beginthread(rec,0,NULL);
//	cout << "OK" << endl;
	while(1)
	{
		Sleep(1000);
	}
	closesocket(s);
	WSACleanup();
	return 0;
}

 

 

转载于:https://www.cnblogs.com/longcheng2012/archive/2012/09/19/2694013.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值