Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何同步套接字上的读取和多次写入_C_Sockets_Locking_Client Server_Mutual Exclusion - Fatal编程技术网

C 如何同步套接字上的读取和多次写入

C 如何同步套接字上的读取和多次写入,c,sockets,locking,client-server,mutual-exclusion,C,Sockets,Locking,Client Server,Mutual Exclusion,我在问一些理论性的问题,因为我很难发布相关项目的代码,因为它包含了太多的文件 我正在为一个服务器程序编写代码,该程序必须与多个客户机通信,这些客户机发送各种不同的请求,并期望每个请求都得到响应。 服务器是多线程的,因此每个线程都相互访问客户机连接列表,并执行请求中的所有操作 这两个部分通过AF_UNIXsockets进行通信,为了实现互斥,我使用了锁和条件变量 现在我的问题是:在执行的某些交错中,服务器端最终会同时向客户机进行两次写入(实际上,服务器中的两个工作线程都向同一客户机发送一条消息),

我在问一些理论性的问题,因为我很难发布相关项目的代码,因为它包含了太多的文件

我正在为一个服务器程序编写代码,该程序必须与多个客户机通信,这些客户机发送各种不同的请求,并期望每个请求都得到响应。 服务器是多线程的,因此每个线程都相互访问客户机连接列表,并执行请求中的所有操作

这两个部分通过
AF_UNIX
sockets进行通信,为了实现互斥,我使用了锁和条件变量

现在我的问题是:在执行的某些交错中,服务器端最终会同时向客户机进行两次写入(实际上,服务器中的两个工作线程都向同一客户机发送一条消息),这只需要一次。对于不吉利的交错,客户端只能读取服务器发送的一条消息,但我注意到,有时这种情况不会发生,而且一切正常,这是因为对客户端的两个不同请求恰好在时间上相隔很远

甚至当一个服务器线程在客户端调用read之前进行写操作,并且在这两个事件之间,另一个服务器线程调用对同一客户端的另一次写操作时,也会发生此问题。在这种情况下,客户端只接收最近的写入

根据我对阻塞模式(我正在使用)的理解,
read()和write()
应该在没有人从另一端接收时阻塞。现在我不明白为什么服务器工作者的第二次写入会完全丢失?如果没有人接收,它是否应该阻止,然后在客户端调用read时恢复

我是否应该在套接字上使用互斥,以便第二次写入应该等待前一次写入完全完成


我希望我的问题是明确的,即使我没有显示任何代码,如果有必要,请告诉我,我会尝试张贴一些代码。我认为这个问题可能只是一个概念性的问题,关于我对read()、write()和互斥的理解,但我知道这个问题可能在其他地方,没有代码就很难解决!谢谢大家!

关于阻塞模式(我正在使用)read()和write()应该在没有人从另一端接收时阻塞。
错了。当没有任何内容可读取(尚未读取)或本地缓冲区已满且写入被限制时,它们会阻塞。如果连接的另一端崩溃或退出,则连接中断会导致您一侧出现EOF(或EPIPE,或连接重置等)。。。。假设TCP。。。UDP是不同的。(除了EOF/断开连接这件事,这是完全不同的)您是检查
send()
/
write()
返回值,还是简单地假设它们成功?不检查这些数据可以解释丢失的数据;否则丢失的数据就是个谜。@是的,我会检查返回值和读/写字节@wildplasser我在这个项目上没有使用TCP,但我认为你的评论也适用于我的情况。。。我继续分析问题,我认为问题不在于阻塞概念,而在于客户端只读取一条消息(消息大小是固定的),而服务器只进行两次写入。。。你认为在写操作上加互斥可以吗?
关于阻塞模式(我正在使用)read()和write()应该在没有人从另一端接收时阻塞。
错了。当没有任何内容可读取(尚未读取)或本地缓冲区已满且写入被限制时,它们会阻塞。如果连接的另一端崩溃或退出,则连接中断会导致您一侧出现EOF(或EPIPE,或连接重置等)。。。。假设TCP。。。UDP是不同的。(除了EOF/断开连接这件事,这是完全不同的)您是检查
send()
/
write()
返回值,还是简单地假设它们成功?不检查这些数据可以解释丢失的数据;否则丢失的数据就是个谜。@是的,我会检查返回值和读/写字节@wildplasser我在这个项目上没有使用TCP,但我认为你的评论也适用于我的情况。。。我继续分析问题,我认为问题不在于阻塞概念,而在于客户端只读取一条消息(消息大小是固定的),而服务器只进行两次写入。。。你认为在写操作上加一个互斥可以吗?