VS2017下的C++写的TCP服务器端程序

TCP都是差不多的可以直接套用,稍微改一下数据就行了

#pragma comment(lib, "Ws2_32.lib")
#include <iostream>
#include <Winsock2.h>
#include <WS2tcpip.h>
//#include "pch.h"


/*
TCP的服务器端程序


*/
int main()
{
    
    
	//加载套接字库
	WORD wVersionRequested;      //用于保存WinSock库的版本号
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1, 1);  //请求版本号

	err = WSAStartup(wVersionRequested, &wsaData);  //用改函数加载套接字库
	if (err != 0)
	{
    
    
		return -1;
	}

	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) //判断是不是我们请求的版本号,不是就进入函数
	{
    
    
		WSACleanup();
		return -1;
	}

	//1.创建用于监听的套接字
	//接收返回的套接字 AF_INET->IPv4,SOCK_STREAM->创建流式套接字, 0->自动选择合适协议
	SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); 

	SOCKADDR_IN addrSrv;  //结构体
	//sin_addr主机的IP地址然后他也是一个结构体,将点分十进制IP地址转换为u_long 类型
	//htonl把u_long类型的值从主机字节顺序转换为TCP/IP网络字节序
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
	addrSrv.sin_family = AF_INET;   //地址族
	//指定分配给套接字的端口,htons把u_short类型的值从主机字节顺序转换为TCP/IP网络字节序
	addrSrv.sin_port = htons(6000);  

	//2.绑定套接字
	bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

	//3.将套接字设为监听模式, 准备接收客服请求
	//sockSrv设置的套接字
	//5是等待连接队列的最大长度
	listen(sockSrv, 5);

	//定义了一个地址结构体变量,用于接收客户端的地址信息
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);

	while (1)
	{
    
    
		//4.等待客户请求到来
		SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
		char sendBuf[100];
		char str[INET_ADDRSTRLEN]; //str[22]
		//inet_ntop函数将标准文本形式的IPv4或IPv6转换成2进制
		sprintf_s(sendBuf, 100, "Welcome %s to my Blog",
			inet_ntop(AF_INET, &addrClient.sin_addr, str, sizeof(str)));
		//发送数据
		//sockConn已建立连接的套接字
		//sendBuf指向缓冲区的指针,是要发送的数据
		//缓冲区大小
		//0是个flag
		send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
		char recvBuf[100];  

		//接收数据
		//sockConn建立连接的套接字
		//recvBuf接收数据的缓冲区
		//100 缓冲区大小
		//0 flag决定函数的行为
		recv(sockConn, recvBuf, 100, 0);

		//打印接收的数据
		printf("%s\n", recvBuf);

		//关闭套接字
		closesocket(sockConn);

	}

	return 0;

}

猜你喜欢

转载自blog.csdn.net/weixin_50188452/article/details/114693991