我在两个不同的进程之间使用AF_UNIX,SOCK_STREAM套接字用于IPC。客户端通过服务器选择并处理的套接字发送数据。客户端写入套接字的每个数据块的大小大约为13 KB,使用以下命令:
Send Command in client : send(s, txPackDisp, sizeof(float)*PACKET_LENGTH, 0);
但是,当我使用以下命令在服务器上接收数据时:
Receive command in server : recv(s, bfoData, PACKET_LENGTH*sizeof(float),0);
每次收到的数据只是我发送的部分内容(最后有很多零,不应该是这种情况)。
所以我的问题是:
我可以通过AF_UNIX,SOCK_STREAM套接字发送的数据大小的最大限制是否有限制(根据我的阅读,我认为没有)
套接字在传输时是否会将数据分解为更小的块,如果是这样的话,我需要单独接收较小的块,或者像我现在正在做的那样接收单个块。
在这里使用AF_UNIX,SOCK_DGRAM套接字会更好。
P.S:在这个问题中可以看到服务器和客户端主要功能的源代码:IPC using Unix Domain Sockets
答案 0 :(得分:3)
Q1) Is there a limit on the maximum limit on the size of data that I can send over the AF_UNIX,SOCK_STREAM socket ( from what I have read , I don't think there is )
你是对的。 SOCK_STREAM没有实际限制。
Q2 a) Does the socket break up the data into smaller blocks when transferring
你是对的。该流被分解为可管理大小的分组,由发送器和接收器协商。
Q2 b) and if thats the case do I need to receive the smaller blocks individually or as single block like I am doing right now.
你不需要做任何事情。流在另一端重新组装,就像传输一样。
Q3) Will it be better to use AF_UNIX,SOCK_DGRAM socket here.
没有。 除非您需要了解有关数据包大小协商的所有信息,检查丢失的数据包并重新发送它们,确保无序接收的数据包得到妥善管理等。
答案 1 :(得分:2)
对于SOCK_STREAM套接字,不保留消息边界。系统可以将消息分段为远程端的多条消息。
另一方面,SOCK_DGRAM套接字始终要么发送整个消息,要么都不发送消息。
请参阅:socket的POSIX规范:
SOCK_STREAM提供有序,可靠,双向,连接模式的字节流,并可为带外数据提供传输机制。 SOCK_DGRAM提供数据报,它是无连接模式,固定最大长度的不可靠消息。
和send:
如果消息太长而无法通过基础协议,则send()将失败,并且不会传输任何数据。
在AF_UNIX的情况下,决定是否可以发送消息的主要决定因素是连续缓冲区的可用性,其大小足以容纳您的数据。由于您发送的是13KB,这不太可能是一个问题。
如果您坚持使用SOCK_STREAM,那么您的接收代码需要做好准备,因为对recv的单次调用可能无法检索发件人发送的整个邮件。 recv将返回实际接收的字节数,如果有错误则返回-1。如果消息是固定长度,那么您可以重复调用它,直到您收到整条消息。
如果您切换到使用SOCK_DGRAM,那么您可以放心,整个邮件将在一次点击中发送,但是您可以发送的邮件数量有限制。 13KB应该没问题。
通常,不保证SOCK_DGRAM可靠或者按顺序传递消息。但是在大多数unix实现中,AF_UNIX数据报是可靠的,不会被重新排序(请参阅:man unix。请查看手册页以了解您的风格,看看是否适用)。