我想知道:当使用套接字(AF_UNIX)在C中编程时,在发送或接收套接字时是否有任何限制(以字节为单位)?
答案 0 :(得分:6)
您可以使用setsockopt
(SO_SNDBUF
和SO_RCVBUF
)更改每个套接字连接的读写缓冲区。
默认和最大尺寸取决于平台。
此外,如果您为每个阅读提供更大的用户端缓冲区,例如与recv
。
如果你按顺序使用多个recv
,你可以通过一个连接读取无限量的字节,它只需要很长的时间。
答案 1 :(得分:0)
套接字行为是依赖于实现的。通常,当您发送()时,无法保证将多少字节推送到套接字上。由于内核控制它,它可以是任何数字,通常在1500或更小的范围内。因此,您需要做的是检查send()返回代码并继续将数据推送到套接字上,直到完成为止。此示例假定您已使用以下命令将套接字设置为非阻塞:
fcntl(s, F_SETFL, O_NONBLOCK);
int sendall(int s, char *buf, int *len)
{
int total = 0; /* how many bytes we've sent */
int bytesleft = *len; /* how many we have left to send */
int n=0;
int retries=0;
struct timespec tp={0,500};
while(total < *len)
{
n = send(s, buf+total, bytesleft, 0);
if (n == -1)
{
/* handle errors here,
plus check for EWOULDBLOCK
and then nanosleep()
*/
}
total += n;
bytesleft -= n;
}
要回答您的问题 - 没有限制,您只能通过一次send()调用发送所有数据。