一个客户端socket 多线程请求数据,recv时数据混乱

客户端建立一个socket,且仅有这一个socket,用这个socket同时send,然后服务器返回数据,客户端多线程recv时几种数据混乱了。比如:客户端同时请求两个接... 客户端建立一个socket,且仅有这一个socket,用这个socket同时send,然后服务器返回数据,客户端多线程recv时几种数据混乱了。比如:客户端同时请求两个接口,1、获取地址 2、获取温度
第一个接口服务器返回数据:成都市金牛区
第二个接口服务器返回数据:二十八摄氏度

客户端的那一个socket接收的数据可能就是这样的:
成都市摄氏度
二十八金牛区

请问怎么解决这个单socket,多线程同时请求数据的问题呢?
PS:一个接口建立一个socket可以解决这个问题,但是我希望一个socket搞定
展开
 我来答
百度网友d050c1b
推荐于2016-03-30 · TA获得超过933个赞
知道小有建树答主
回答量:1083
采纳率:50%
帮助的人:1027万
展开全部
之所以接收数据时发生混乱,是因为,不能通过收到的数据分辨出它是哪个请求对应数据。
处理这类需要在同一个“通道”(socket) 请求不同服务的问题时,一个常见的做法是,在返回的数据中标识出这个数据对应的请求是哪个。
比如,req: id->1,返回是 rsp: id->1; req: id->2,返回是: rsp: id->2
然后,客户端根据返回的 id 找到对应的请求,就可以区分出数据,就不会混乱了。

加锁只是保证同一时间socket 只处理一个请求,不能保证客户端能够正确区分出请求对应的返回数据。
追问
发送的数据流过大,就会分包发送,假设一个包被分三次发送了,那么第二次和第三次的包就没有“标识”,这两次的包怎么区分呢?有办法给每个分包都打上“标识”吗?
追答
看具体是怎么实现的,tcp会自已分包,udp如果“业务”上需要分包,需要自己写分包重发等算法,也需要调整服务端。

tcp分包对于应用程序是透明的,客户端和服务端不需要关心具体的分包实现。

以你这边的业务来讲,如果是用tcp实现,只需要关心把带有标识的 request 发送出去,服务端处理就行了,不需要关心具体的分包,那是下层协议(tcp/ip)需要处理的事情。
arthur_mg
2014-10-03
知道答主
回答量:1
采纳率:0%
帮助的人:1326
展开全部
给服务器端套接字加锁。
更多追问追答
追问
我的服务器用C写的  开发环境是VC++6.0,请问怎么加锁呢?
追答
嗯,准确地说,是搞一个缓冲区,把要发的数据都放到缓冲区,对这个缓冲区加锁。
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
usleep(ms*1000);
}
这是定义锁函数。线程操作时,先lock,然后unlock
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式