第一次接触Client-Server,使用CSocket的问题

本文探讨了使用CSocket进行客户端与服务器双向通信时遇到的问题及解决方案。通过为客户端分配两个独立的socket,一个用于持续发送数据,另一个专门用于接收服务器响应,解决了线程并发收发数据的难题。

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

第一次使用CSocket,遇到的问题不少。比如:

1. A客户端主动发送数据至服务器,且会一直进行。那么,服务端处理A时,就会影响到其他客户端的数据接收。则需要开一个线程来处理A发送的数据,就会出现问题:创建线程时该传递什么参数?如何传?

有试过,直接将Receive(&ndata,sizeof(ndata)-1); ndata数组直接传递过去,但是在线程那边不太好接收,因为线程时在socket重载类里创建的,引用类中的数组需要类指针传过去。

后来,查资料,选择使用SOCKET hSocket = this->Detach(); 

线程里

CPaneClient *pThis = new CPaneClient;
pThis->Attach((SOCKET)lpParam);
将套接字传过去。但这样,出现了第2个问题

2. OnReceive(int nErrorCode)函数中移除了改socket的hSocket ,则说明不能使用该socket。而服务器有需要给A传递一些数据。起初,很自然地把需要传递的数据,放到接收A数据的线程里,但是这样,A并不能接收到服务器发送的数据。 A与服务器该如何进行收发数据?

A客户端一直发送数据,但也需要接收服务器发送来的数据。在线程里,同时收发,好像不行。线程一直循环,判断

	   nLen = Receive(&ndata,sizeof(ndata)-1); if(nLen>0)
>0则说明接收到数据,需要处理,会影响到发送。

后面选择A采用两个sokcet,一个 Detach到线程里面进行循环发送,一个用于接收服务端的数据,显示至界面。当然,服务端需要区分好这两个socket,A用于发数据的socket服务端则用于收,反之亦然。

好在其他客户端与服务端的通信不多,仅在服务端发送指令后,发送对应的数据。不然,得考虑每个客户端建一个收发的线程。


期间,有发帖。在此附上链接,方便以后查阅。

Socket服务端接收数据的处理



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值