socket 编程(五) windows tcp

本文提供了一个基于 Windows 的 TCP 服务器和客户端的 C++ 示例代码。该示例展示了如何建立 TCP 连接、进行数据收发,并通过线程处理多个客户端连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows tcp demo

win_tcp_server:

// win_tcp_server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include<Windows.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)

DWORD WINAPI Thread_rx(LPVOID p)
{
	SOCKET sockClient = *(SOCKET*)p;
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	
	getpeername(sockClient,(SOCKADDR*)&addrClient,&len);
	printf("Thread_rx,sockClient %lld,%s:%d pid = %d\n", sockClient, inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port), GetCurrentThreadId());
	
	int ret = 1;
	while (ret > 0) {
		char recvbuf[1024] = { 0 };
		ret = recv(sockClient, recvbuf, sizeof(recvbuf), 0);
		printf("recv len %d:%s\n",ret, recvbuf);
		strcat(recvbuf," res");
		send(sockClient, recvbuf, (int)strlen(recvbuf), 0);
	}
	printf("Thread_rx pid = %d exit\n", GetCurrentThreadId());
	return 0;
}


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

	// Winsock库版本,低字节代表主版本,高字节代表副版本
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		return -1;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		//终止对winsock库的使用
		WSACleanup();
		return -1;
	}

	// 创建套接字
	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(addrSrv));

	// 监听
	listen(sockSrv, 5);// 5表示连接队列,超过5个client后会被拒绝连接
	printf("start listen\n");
	while (1)
	{
		// 用于接收客户端的地址信息
		SOCKADDR_IN addrClient;
		int len = sizeof(SOCKADDR);

		// 接受客户端的连接,返回client的套接字。
		SOCKET sockConn = accept(sockSrv, (SOCKADDR*)& addrClient, &len);

		// 发送数据 
		char sendBuf[1024];
		char ipstr[24] = { 0 };
		sprintf(sendBuf, "Welcome %s:%d to here!", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));
		printf("%s\n",sendBuf);
		send(sockConn, sendBuf, (int)strlen(sendBuf), 0);

		// 创建一个线程,单独处理client收发
		HANDLE hThread;
		DWORD  threadId;
		hThread = CreateThread(NULL, 0, Thread_rx, &sockConn, 0, &threadId);
	}

	return 0;
}

win_tcp_client:

// win_tcp_client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <Windows.h>
#include <stdio.h>
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)

int main(int argc, char* argv[])
{
	// 加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	// Winsock库版本,低字节代表主版本,高字节代表副版本
	wVersionRequested = MAKEWORD(2, 2);
	err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
	{
		return -1;
	}
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		//终止对winsock库的使用
		WSACleanup();
		return -1;
	}

	// 创建套接字
	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

	// 连接服务器
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	connect(sockClient, (SOCKADDR*)& addrSrv, sizeof(SOCKADDR));

	int pid = _getpid();
	int recvLen = 1;
	int i = 0;
	// 发送数据
	while (recvLen > 0)
	{
		// 接收数据
		char recvBuf[1024] = { 0 };
		recvLen = recv(sockClient, recvBuf, 100, 0);
		printf("recvLen %d,%s\n", recvLen, recvBuf);

		char sendbuf[1024] = { 0 };
		sprintf(sendbuf, "<%d>This is Client %4d",i++,pid);
		int sentLen = send(sockClient, sendbuf, (int)strlen(sendbuf), 0);
		Sleep(3000);
	}
	
	//关闭套接字
	closesocket(sockClient);

	//终止套接字库的使用
	WSACleanup();

	return 0;
}

运行效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值