我目前在Tru64上运行一个旧系统,它使用sendto()函数使用了大量的UDP套接字。在我们的代码中,套接字用于向/从各种进程发送消息,然后最终发送到远程连接的胖客户端应用程序。有时,胖客户端的套接字会卡住,这可能会导致其中一些消息堆积起来。我的问题是如何确定当前的缓冲区大小,以及如何确定最大消息缓冲区。下面的代码给出了我如何设置端口和使用sendto函数的代码片段。
/* need to adjust the maximum size we can send on this */
/* as it needs to be able to cope with the biggest */
/* messages we send */
lenlen = sizeof(len) ;
/* allow double for when the system is under load */
int lenlen, len ;
lenlen = sizeof(len) ;
len = 2 * 32000;
msg_socket = socket( AF_UNIX,SOCK_DGRAM, 0);
result = setsockopt(msg_socket, SOL_SOCKET, SO_SNDBUF, (char *)&len, lenlen) ;
result = sendto( msg_socket,
(char *)message,
(int)message_len,
flags,
dest_addr,
addrlen);请注意。我们已经将此应用程序移植到Linux上,问题似乎没有出现在那里。
任何帮助都将不胜感激。
问候
发布于 2010-09-11 06:41:33
您可能应该使用某种类型的拥塞控制,以避免网络过载。到目前为止,最简单的方法是使用TCP而不是UDP。
它在Linux上失败的频率较低,因为UDP套接字在Linux上等待本地网络接口队列中的空间(除非您将它们设置为非阻塞)。但是,对于任何操作系统,如果超满队列不在本地系统中,数据包将被静默丢弃。
https://stackoverflow.com/questions/2809972
复制相似问题