基于TCP的简单服务器端 和 客户端程序

利用vs2013进行网络编程时,若提示没法解析的外部命令,可能是没有去链接ws2_32.lib库文件。

解决方法:项目—〉属性-〉链接器->输入->附加依赖项,在其中填入ws2_32.lib

 

服务器端:

#include<Winsock2.h>   //因为使用到winSock库中的函数
#include<stdio.h>
#include<iostream>
#include <windows.h>

using namespace std;

void  main()
{
   // 第一步 :加载套接字库
	  WORD wVersionRequested = MAKEWORD(1,1);;    // 准备加载的版本 如 2.1:表示主版本号是2  
	  WSADATA wsaData;    //存放系统打算加载的版本号 以及 套接字库中的最高版本

	  int err = WSAStartup(wVersionRequested, &wsaData);   //加载成功则返回0
	
	  if (err != 0)
	  {
		  cout << "加载套接库失败" << endl;
		  return;
	  }

	  //如果系统打算的使用的套接字库的 主版本号不为1 或者 副版本号不为1
	  //也就是说 如果系统打算加载的版本不是 1.1,那么终止对套接字库的使用
	  if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	  {
		  WSACleanup();     //终止对套接字库的使用
		  return;
	  }

	 //第二步:创建用于监听的流式套接字(TCP协议使用的流式套接字)
	  SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);     //第一个参数和第三个参数不用关心

	 //第三步:将套接字绑定到 本地地址 和 端口上
	  SOCKADDR_IN  addrSrv;       //用来存放本地地址 和 端口 的结构体
	  
	  addrSrv.sin_family = AF_INET;     //固定的,不用管
	  //htonl是将unsigned long转化为网络字节顺序
	  //INADDR_ANY 表示是本机的IP
	  addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);   //绑定服务器的IP地址  
	  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[]="1111111111";
		 send(sockConn, sendbuf, 11, 0);

		 char sendbuf1[] = "2222222222";
		 send(sockConn, sendbuf1,11, 0);
  
		 //接收数据
		  char recvBuf[11];
		  recv(sockConn, recvBuf, 11, 0);

		  char recvBuf1[11];
		  recv(sockConn, recvBuf1, 11, 0);

         //打印接收的数据
		  cout << recvBuf << endl;
          cout << recvBuf1<< endl;

		 //第七步:关闭套接字
		  closesocket(sockConn);     //关闭新形成的套接字
		  Sleep(500);
	  }
}

  客户端:

#include<Winsock2.h>   //因为使用到winSock库中的函数
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include<iostream>

using namespace std;

void  main()
{
	// 第一步 :加载套接字库
	WORD wVersionRequested = MAKEWORD(1, 1);;    // 准备加载的版本 如 2.1:表示主版本号是2  
	WSADATA wsaData;    //存放系统打算加载的版本号 以及 套接字库中的最高版本

	int err = WSAStartup(wVersionRequested, &wsaData);   //加载成功则返回0

	if (err != 0)
	{
		cout << "加载套接库失败" << endl;
		return;
	}

	//如果系统打算的使用的套接字库的 主版本号不为1 或者 副版本号不为1
	//也就是说 如果系统打算加载的版本不是 1.1,那么终止对套接字库的使用
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		WSACleanup();     //终止对套接字库的使用
		return;
	}

	while (1)
	{
	//第二步:创建用于流式套接字(TCP协议使用的流式套接字)
	SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);     //第一个参数和第三个参数不用关心

	//第三步:用套接字向服务器发送连接请求
	SOCKADDR_IN  addrSrv;       //用来存放本地地址 和 端口 的结构体

	addrSrv.sin_family = AF_INET;     //固定的,不用管

	//htonl是将unsigned long转化为网络字节顺序
	//INADDR_ANY 表示是本机的IP
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");      //绑定服务器的IP地址  
	addrSrv.sin_port = htons(6000);

	connect(sockSrv, (SOCKADDR*)&addrSrv, sizeof(addrSrv));
	

	//第四步:接收和发送数据
		//发送的数据
		char sendbuf[] = "客户端1111";
		char sendbuf1[] = "客户端2222";
		send(sockSrv, sendbuf, strlen(sendbuf)+1, 0);
		send(sockSrv, sendbuf1, strlen(sendbuf1)+1,0);

		
		//接收数据
		char recvBuf[100];
		recv(sockSrv, recvBuf, 11, 0);

		char recvBuf1[100];
		recv(sockSrv, recvBuf1, 11, 0);

		cout << recvBuf << endl;
     	cout << recvBuf1 << endl;

		Sleep(500);

	  //第五步:关闭套接字
		closesocket(sockSrv);     //关闭套接字
	}
	  // WSACleanup();      //终止对套接字库的使用

}

猜你喜欢

转载自blog.csdn.net/qq_29824717/article/details/81486235