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

利用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_DGRAM, 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));


	SOCKADDR_IN addrClient;    //存放
	int len = sizeof(SOCKADDR);

	while (1)
	{
		//第五步 收发数据
		//接收数据
		char recvBuf[11];
		recvfrom(sockSrv, recvBuf, 11, 0, (SOCKADDR *)&addrClient,&len);

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

		char sendbuf[] = "1111111111";
		sendto(sockSrv, sendbuf, strlen(sendbuf) + 1, 0, (SOCKADDR *)&addrClient, sizeof(SOCKADDR));


		//第六步:关闭套接字
		closesocket(sockSrv);     //关闭新形成的套接字
		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;
	}

	int len = sizeof(SOCKADDR);

		//第二步:创建用于流式套接字(TCP协议使用的流式套接字)
		SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 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);


  while (1)
	{
		//第四步:接收和发送数据
		//发送的数据
		char sendbuf[] = "客户端1111";
		sendto(sockSrv, sendbuf, 11, 0, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));


		//接收数据
		char recvBuf[11];
		recvfrom(sockSrv, recvBuf, 11, 0, (SOCKADDR *)&addrSrv, &len);
		Sleep(500);

		cout << recvBuf << endl;

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

}

猜你喜欢

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