[英]Maximum length of buffer in AF_UNIX socket
我想知道:當使用套接字(AF_UNIX)在C編程時,在發送或接收套接字時是否有任何限制(以字節為單位)?
您可以使用setsockopt
( SO_SNDBUF
和SO_RCVBUF
)更改每個插槽連接的讀寫緩沖區。
默認大小和最大大小取決於平台。
此外,如果您為每個單獨的讀取提供更大的用戶端緩沖區,例如使用recv
。
如果你按順序使用幾個recv
,你可以通過連接讀取無限量的字節,它只需要無限長。
套接字行為是依賴於實現的。 通常,當您發送()時,無法保證將多少字節推送到套接字上。 由於內核控制它,它可以是任何數字,通常在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()調用發送所有數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.