Visual C++ネットワークプログラミング学習(1)-UDPブロックモデル


Visual C++ネットワークプログラミング学習(1)-UDPブロックモデル
C++を用いて簡単なUDPブロックモデルを構築し,クライアントの送信とサーバの受信を行っただけである.プログラムはもう一回テストしました.もしみんなが見ている間に何か問題があったら、お互いに交流してほしいです.コードは次のとおりです.
サーバコード:
#include
#include
#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

クライアントコード:
#include
#include 
#include
#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<