孙鑫 VC++深入详解第14课——TCP通信/UDP通信

一.用VC++来编写TCP 服务器/客户端的简单程序。

注意事项:

1.要加载ws2_32.lib链接库。

项目->属性->弹出属性页->连接器->输入->附加依赖项

2.要使用#include 头文件。


实现步骤:

1.服务器端:

①加载套接字库 (可以直接从MSDN上复制  WSAStartup)

②创建socket

③绑定socket(bind)

④将socket设置成监听状态(listen)

⑤等待客户端的访问(accept)

⑥接收客户端信息(recv)

⑦往客户端发送信息(send)

⑧关闭套接字(closesocket)

⑨清除套接字库(WSACleanup)


代码:

#include 
#include 
#include 
using namespace std;

void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0)
	{
		return ;
	}
	if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		return ;
	}

	//创建用于监听的套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);

	//绑定套接字
	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	//将套接字设置为监听模式
    listen(sockSrv,5);

	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);

	while (1)
	{
		//等待客户的请求到来
	    SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		char sendBuf[100];
		sprintf_s(sendBuf,100,"Welcome %s to www.sunxin.org",inet_ntoa(addrClient.sin_addr));

		//发送数据
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		char recvBuf[100];
		//接受数据
		recv(sockConn,recvBuf,100,0);
		//打印接受的数据
		printf("%s\n",recvBuf);
		//关闭套接字
		closesocket(sockConn);
	}
}


2.客户端:

①加载套接字库

②向服务器发送请求 connect

③接受服务器的信息 recv

④向服务器发送信息 send

⑤关闭套接字 closesocket

⑥清除套接字库 WSACleanup


代码:

#include 
#include 
#include 
using namespace std;

void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0)
	{
		return ;
	}
	if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		return ;
	}

	//创建套接字
	SOCKET socketClient = socket(AF_INET,SOCK_STREAM,0);
	//向服务器发送请求
	SOCKADDR_IN sockAddrClient;
	sockAddrClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	sockAddrClient.sin_family = AF_INET;
	sockAddrClient.sin_port = htons(6000);
	connect(socketClient,(SOCKADDR*)&sockAddrClient,sizeof(SOCKADDR));
	//接受信息
	char recvBuf[100];
	recv(socketClient,recvBuf,100,0);
	printf("%s\n",recvBuf);
	//发送数据
	send(socketClient,"This is lisi",strlen("This is lisi")+1,0);
	//关闭套接字
	closesocket(socketClient);
	WSACleanup();
    cin.get();
	cin.get();
}

二.用VC++来编写UDP 服务器/客户端的简单程序。

1.服务器端:

①加载套接字库(WSAstartup)

②创建socket

③绑定socket(bind)

④接受从客户端发来的信息(recvfrom)

⑤关闭套接字(closesocket)

⑥清空套接字库(WSAClearup)

代码:

#include 
#include 
#include 

using namespace std;

void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0)
	{
		return ;
	}
	if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		return ;
	}

	//创建套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

	SOCKADDR_IN sockAddrSrv;
	sockAddrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	sockAddrSrv.sin_family = AF_INET;
	sockAddrSrv.sin_port = htons(6000);
	//绑定套接字
	bind(sockSrv,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));

	SOCKADDR_IN sockAddrClient;
	int len = sizeof(SOCKADDR);
	char recvBuf[100];
	//接受客户端信息
	recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&sockAddrClient,&len);
	printf("%s\n",recvBuf);

	//关闭套接字
	closesocket(sockSrv);
	//清除套接字库
	WSACleanup();
	cin.get();
	cin.get();
}


2.客户端:

①加载套接字库 (WSAstartup)

②创建socket

③发送数据(sendto)

④关闭套接字(closesocket)

⑤清空套接字库(WSAClearup)

#include 
#include 
#include 

using namespace std;

void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0)
	{
		return ;
	}
	if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
	{
		WSACleanup();
		return ;
	}
	//创建套接字
	SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
	
	SOCKADDR_IN sockAddrSrv;
	sockAddrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	sockAddrSrv.sin_family = AF_INET;
	sockAddrSrv.sin_port = htons(6000);

	//char sendBuf[100];
	sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));
	closesocket(sockClient);
	WSACleanup();
	cin.get();
	cin.get();
}


你可能感兴趣的:(孙鑫,VC++深入详解)