Visual C++网络编程学习(1)-UDP阻塞模型

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43165699/article/details/100057849

Visual C++网络编程学习(1)-UDP阻塞模型

       利用C++搭建了一个简单的UDP阻塞模型,只是做了客户端的发送与服务器的接收。程序我已经测试了一遍,如果大家在看的过程中有什么问题,也希望大家相互交流。代码如下:

       服务器代码:

#include<iostream>
#include<WINSOCK2.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;

#define SERVEPORT 10000
#define CLIENTPORT 100

class CUdpConnectServe
{
public:
	CUdpConnectServe()
	{};
	~CUdpConnectServe()
	{};
	//socket函数
	int InitSocketConnect();    //初始化SOCKET
	void CloseSocketConnect();  //关闭SOCKET
	int Receive(
		_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,
		_In_ int len,
		_In_ int flags
                     );
	//客户端地址
	sockaddr_in m_soClientAddr;
private:
	SOCKET m_SocketServe;
	sockaddr_in m_soServeAddr;  
	SOCKET m_SocketClient;
	int m_nAddrlen;
};
//初始化SOCKET
int CUdpConnectServe::InitSocketConnect()
{
	//初始化Winsock

	WSADATA wsaData = { 0 };
	WORD wVer = MAKEWORD(2,2);
	if (0!=WSAStartup(wVer, &wsaData))
	{
		cout << "初始化错误,错误代码:" << WSAStartup(wVer, &wsaData) << endl;
		return 0;
	}
	//服务器创建套接字
	if (NULL!=m_SocketServe)
	{
		closesocket(m_SocketServe);	
	}
	m_SocketServe = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (INVALID_SOCKET==m_SocketServe)
	{
		cout << "创建套接字错误,错误代码:" << WSAGetLastError() << endl;
		return 0;
	}
	cout << "套接字创建成功"<< endl;


	//服务器将本地套接字地址绑定到套接字上
	m_soServeAddr.sin_family = AF_INET;
	m_soServeAddr.sin_port = SERVEPORT;
	m_soServeAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	if (bind(m_SocketServe, (sockaddr*)&m_soServeAddr,sizeof(m_soServeAddr)))
	{
		cout << "套接字绑定错误" << WSAGetLastError() << endl;
		return 0;
	}
	cout << "套接字绑定成功"<< endl;
	return 0;
}
//关闭SOCKET
void CUdpConnectServe::CloseSocketConnect()
{
	closesocket(m_SocketServe);
	WSACleanup();       //释放资源
}
//接收函数
int CUdpConnectServe::Receive(__out_data_source(NETWORK) char * buf, int len, int flags)
{
	m_nAddrlen= sizeof(m_soServeAddr);
	int nRet = recvfrom(m_SocketServe, buf,len, flags, (sockaddr*)&m_soClientAddr,&m_nAddrlen);
	return  nRet;
}
//主函数
void main()
{
	CUdpConnectServe udpConnect;
	udpConnect.InitSocketConnect();

	//初始化客户端地址
	udpConnect.m_soClientAddr.sin_family =AF_INET;
	udpConnect.m_soClientAddr.sin_port = CLIENTPORT;
	udpConnect.m_soClientAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	int buffsize = 10000;
	char *revBuffer = (char*)malloc(sizeof(char)*buffsize);
	while (1)
	{
		int nRet=udpConnect.Receive(revBuffer, buffsize,0);
		cout << "收到" << nRet << "个字节数据" << endl;
		cout << "收到数据为:" ;
		for (int i=0;i<nRet;i++)
		{
			cout << *(revBuffer +i);
		}
		cout <<""<< endl;;
	}
}

      客户端代码:

#include<iostream>
#include <string>
#include<WINSOCK2.h>
#pragma comment(lib,"Ws2_32.lib")
using namespace std;

#define SERVEPORT 10000
#define CLIENTPORT 100
class CUdpConnectClient
{
public:
	CUdpConnectClient()
	{
		m_nAddrlen = sizeof(m_soServeAddr);
	};
	~CUdpConnectClient()
	{};
	//socket函数
	int InitSocketConnect();    //初始化SOCKET
	void CloseSocketConnect();  //关闭SOCKET
	int Send(
		_In_reads_bytes_(len) const char FAR * buf,
		_In_ int len,
		_In_ int flags
	);
	//服务器地址
	sockaddr_in m_soServeAddr;

   private:
	SOCKET m_SocketServe;
	sockaddr_in m_soClientAddr;
    SOCKET m_SocketClient;
	int m_nAddrlen;
};
//初始化SOCKET
int CUdpConnectClient::InitSocketConnect()
{
	//初始化Winsock

	WSADATA wsaData = { 0 };
	WORD wVer = MAKEWORD(2, 2);
	if (0 != WSAStartup(wVer, &wsaData))
	{
		cout << "初始化错误,错误代码:" << WSAStartup(wVer, &wsaData) << endl;
		return 0;
	}
	//服务器创建套接字
	if (NULL != m_SocketClient)
	{
		closesocket(m_SocketClient);
	}
	m_SocketClient= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (INVALID_SOCKET == m_SocketClient)
	{
		cout << "创建套接字错误,错误代码:" << WSAGetLastError() << endl;
		return 0;
	}
	cout << "套接字创建成功" << endl;
	return 0;
}
//关闭套接字
void CUdpConnectClient::CloseSocketConnect()
{
	closesocket(m_SocketClient);
	WSACleanup();                     //系统释放Winsock资源 
}

//发送函数
int CUdpConnectClient::Send(const char * buf, int len, int flags)
{
	int nRet = sendto(m_SocketClient, buf, len, flags, (sockaddr *)&m_soServeAddr, m_nAddrlen);
	if (nRet<0)
	{
		cout << "发送数据错误,错误代码:" << WSAGetLastError() << endl;
	}
	return nRet;
}
//主函数
void main()
{
	CUdpConnectClient udpConnect;
	udpConnect.InitSocketConnect();

	//初始化服务器地址
	udpConnect.m_soServeAddr.sin_family = AF_INET;
	udpConnect.m_soServeAddr.sin_port = SERVEPORT;
	udpConnect.m_soServeAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	
	while (1)
	{
		cout << "请输入要发送的字符串:";
		string s1;
		cin >> s1;
		int buffsize = 10000;
		char *revBuffer = (char*)malloc(sizeof(char)*buffsize);
		int i = 0;
		for ( i= 0; i < s1.size(); i++)
		{
			*(revBuffer + i) = s1[i];
		}
		int nRet=udpConnect.Send(revBuffer,i,0);
		cout << "发送了"<< nRet<<"个字节"<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43165699/article/details/100057849