我在c中使用tcp套接字服务器和客户端。
使用AF_INET,SOCK_STREAM和IPPROTO_TCP
我的客户端发送功能
sent_now = send(sockId, buffer + sent_total, len - sent_total, MSG_DONTWAIT);
当我发送20G至40KB之类的MSG时,它工作正常。
当我发送最大为365K的MSG(这就是我所需要的)时,我在服务器端收到以下错误:资源暂时不可用!
我在服务器端的接收功能
totalRecvMsgSize =接收(clntSocket,Buffer,RCVBUFSIZE,MSG_DONTWAIT);
我发送int数据类型。
如何在一次发送和接收操作中接收所有阵列?
旧帖子
有一个What can cause a “Resource temporarily unavailable” on sock send() command帖子,其中Davide Berra说
我的问题是:
* 1)如何在一次发送和接收操作中接收所有阵列? *
2)select()在此数组大小方面是否对我有帮助?
3)我可以更改缓冲区大小吗?如何更改?
最佳答案
由于这是一个流套接字,因此可以在 send()
上使用循环,并在 MSG_WAITALL
上使用recv()
。
考虑以下辅助功能:
/* Receive the entire buffer.
* Returns 0 if success, nonzero errno otherwise.
*/
static int recv_all(const int sockfd, void *buffer, const size_t len)
{
ssize_t n;
n = recv(sockfd, buffer, len, MSG_WAITALL);
if (n == 0)
return errno = EPIPE; /* Other end will not send more data */
else
if (n == -1)
return errno;
else
if (n < -1)
return errno = EIO; /* Should never occur */
else
if (n != (ssize_t)len)
return errno = EINTR; /* Interrupted, or sender goofed */
else
return 0;
}
/* Send the entire buffer.
* Returns 0 if success, nonzero errno otherwise.
*/
static int send_all(const int sockfd, const void *buffer, const size_t len)
{
const char *pos = (const char *)buffer;
const char *const end = (const char *)buffer + len;
ssize_t n;
while (pos < end) {
n = send(sockfd, pos, (size_t)(end - pos), 0);
if (n > 0)
pos += n;
else
if (n != -1)
return errno = EIO;
else
return errno;
}
}
关于c - 资源暂时不可用-MSG_DONTWAIT标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39959115/