我在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/

10-12 14:11