Windows线程实现Socket服务的/客户端简单通信

本文介绍了如何在Windows环境下使用线程实现Socket服务端和客户端的简单通信。通过示例代码展示了服务端和客户端的实现,适合初学者理解多线程Socket通信的基本原理。

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

Windows线程实现Socket服务的/客户端简单通信

直接给出实现把代码有部分注释:
服务端:

#include<iostream>s
#include<string>
#include<string.h>
#include<Windows.h>
#include<thread>
#pragma comment(lib,"ws2_32.lib")
void Print(SOCKET cli_soc);
using namespace std;
int main()
{
	//初始化套接字
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	//服务的绑定一个套接字
	SOCKET ser_soc = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
	sockaddr_in ser_addr;
	memset(&ser_addr, 0, sizeof(ser_addr));
	ser_addr.sin_family = AF_INET;
	ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	ser_addr.sin_port = htons(1234);
	bind(ser_soc, (SOCKADDR*)&ser_addr, sizeof(ser_addr));
	
	listen(ser_soc, 20);
	cout << "开始监听:" << endl;

	//等待客户端套接字来
	SOCKADDR cli_addr;
	int cli_addr_size = sizeof(cli_addr);
	memset(&cli_addr, 0, sizeof(cli_addr));
	//如果客户端没有执行  服务的会阻塞在这里
	SOCKET cli_soc=accept(ser_soc,(sockaddr*)&cli_addr,&cli_addr_size);

	thread t(Print, cli_soc); //执行接收线程

	cout << "请输入数据:";
	string str;
	cin >> str;

	while (str!="exit")
	{
		send(cli_soc, str.c_str(), str.size(), NULL);
		cin >> str;
	}

	
	shutdown(cli_soc,1);    //关闭发送数据端
	cout << "结束发送数据" << endl;
	t.join();
	closesocket(cli_soc);
	closesocket(ser_soc);

	WSACleanup();

	return 0;
}
void Print(SOCKET cli_soc)
{
	int len;
	char buff[256];
	while ((len = recv(cli_soc, buff, 256, 0)) > 0)
	{
		buff[len] = '\0';
		cout << buff << endl;
	}
	shutdown(cli_soc, 0);
	cout << "结束接收数据" << endl;
}

客户端:

#include<iostream>
#include<string>
#include<string.h>
#include<Windows.h>
#include<thread>
#pragma comment(lib,"ws2_32.lib")
void Cent(SOCKET cli_soc);
using namespace std;
int main()
{
	//初始话套接字
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	//绑定套接字
	SOCKET cli_soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	sockaddr_in cli_addr;
	cli_addr.sin_family = AF_INET;
	cli_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	cli_addr.sin_port = htons(1234);
	
	//判断服务器是否连接成功
	if (connect(cli_soc, (sockaddr*)&cli_addr, sizeof(cli_addr)) == -1) {
		cout << "未成功连接服务器" << endl;
	}
	else {
	     //成功
		string str;
		char buff[240];
		thread t(Cent, cli_soc);    //执行发送线程,主线线程用来接收
		                           //也可以单独写一个线程用来接收
		int len;
	
		while ((len=recv(cli_soc, buff, 240, 0)) > 0)
		{
			//Sleep(10000);            //取消注释可能会出现粘包问题
			buff[len] = '\0';
			cout << buff << endl;
		}

		cout << "结束接受" << endl;
		shutdown(cli_soc, 0);
		t.join();
	}

	closesocket(cli_soc);
	WSACleanup();
	return 0;
}
void Cent(SOCKET cli_soc)
{
	cout << "客户端发送数据:";
	string str;
	cin >> str;
	while (str != "exit")       //接收到exit退出
	{
		send(cli_soc, str.c_str(), str.size(), 0);
		cin >> str;
	}
	cout << "结束发送数据" << endl;
	shutdown(cli_soc, 1);
}
注意:使用的是TCP协议 没有解决TCP的粘包问题,但是由于发送线程少等原因是不会出现粘包问题,因为你发完了一个数据,另外一端已经接收完毕 有兴趣可以把客户端里面的Sleep(10000)取消注释,它让程序暂停执行10秒。在这段时间内发送超过两次数据就会产生粘包问题

觉得还有用的话点个关注吧,点个赞也可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值