一个客户端socket 多线程请求数据,recv时数据混乱
客户端建立一个socket,且仅有这一个socket,用这个socket同时send,然后服务器返回数据,客户端多线程recv时几种数据混乱了。比如:客户端同时请求两个接...
客户端建立一个socket,且仅有这一个socket,用这个socket同时send,然后服务器返回数据,客户端多线程recv时几种数据混乱了。比如:客户端同时请求两个接口,1、获取地址 2、获取温度
第一个接口服务器返回数据:成都市金牛区
第二个接口服务器返回数据:二十八摄氏度
客户端的那一个socket接收的数据可能就是这样的:
成都市摄氏度
二十八金牛区
请问怎么解决这个单socket,多线程同时请求数据的问题呢?
PS:一个接口建立一个socket可以解决这个问题,但是我希望一个socket搞定 展开
第一个接口服务器返回数据:成都市金牛区
第二个接口服务器返回数据:二十八摄氏度
客户端的那一个socket接收的数据可能就是这样的:
成都市摄氏度
二十八金牛区
请问怎么解决这个单socket,多线程同时请求数据的问题呢?
PS:一个接口建立一个socket可以解决这个问题,但是我希望一个socket搞定 展开
2个回答
展开全部
之所以接收数据时发生混乱,是因为,不能通过收到的数据分辨出它是哪个请求对应数据。
处理这类需要在同一个“通道”(socket) 请求不同服务的问题时,一个常见的做法是,在返回的数据中标识出这个数据对应的请求是哪个。
比如,req: id->1,返回是 rsp: id->1; req: id->2,返回是: rsp: id->2
然后,客户端根据返回的 id 找到对应的请求,就可以区分出数据,就不会混乱了。
加锁只是保证同一时间socket 只处理一个请求,不能保证客户端能够正确区分出请求对应的返回数据。
处理这类需要在同一个“通道”(socket) 请求不同服务的问题时,一个常见的做法是,在返回的数据中标识出这个数据对应的请求是哪个。
比如,req: id->1,返回是 rsp: id->1; req: id->2,返回是: rsp: id->2
然后,客户端根据返回的 id 找到对应的请求,就可以区分出数据,就不会混乱了。
加锁只是保证同一时间socket 只处理一个请求,不能保证客户端能够正确区分出请求对应的返回数据。
追问
发送的数据流过大,就会分包发送,假设一个包被分三次发送了,那么第二次和第三次的包就没有“标识”,这两次的包怎么区分呢?有办法给每个分包都打上“标识”吗?
追答
看具体是怎么实现的,tcp会自已分包,udp如果“业务”上需要分包,需要自己写分包重发等算法,也需要调整服务端。
tcp分包对于应用程序是透明的,客户端和服务端不需要关心具体的分包实现。
以你这边的业务来讲,如果是用tcp实现,只需要关心把带有标识的 request 发送出去,服务端处理就行了,不需要关心具体的分包,那是下层协议(tcp/ip)需要处理的事情。
展开全部
给服务器端套接字加锁。
更多追问追答
追问
我的服务器用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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询