当前位置: 首页 > 知识库问答 >
问题:

资源暂时不可用-MSG_DONTWAIT标志

仲孙奇
2023-03-14

我在C中使用tcp套接字服务器和客户端。使用AF_INET、SOCK_STREAM和IPPROTO_TCP

sent_now = send(sockId, buffer + sent_total, len - sent_total, MSG_DONTWAIT);

在sock send()命令上有一个可能导致“资源暂时不可用”的帖子,其中Davide Berra说

这是因为您使用的是非阻塞套接字,并且输出缓冲区已满。

从send()手册页

共有1个答案

詹高畅
2023-03-14

因为这是一个流套接字,所以在send()上使用循环,在recv()上使用msg_waitall

请考虑以下帮助器函数

/* 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;
    }
}
 类似资料:
  • 创建套接字 使其非阻塞 呼叫连接 按预期返回-1和errno EINPROGRESS 调用select 返回>0,因此已建立连接 再次阻塞套接字 此部件的代码如下: 那还行。但是我有一个循环,在这个循环中我调用了一个函数,该函数检查是否收到了要读取的新数据包:

  • 我有一个伪终端从机,它给我一个资源暂时不可用的读/写错误(11)。我一直无法解决这个问题,但直到一周前我还不知道任何事情。所以,我可能漏掉了一些明显的东西。 根据我所了解的情况,这可能是由对非阻塞PTY调用引起的。但是,当我检查从pty的I之后的时,该值显示它是一个阻塞文件描述符。 我甚至尝试将视为非阻塞文件,使用来确定它何时就绪。但是,它只是每次都超时。 那么,如果设置为blocking,为什么

  • 我正在用c语言(使用openwrt作为操作系统)构建一个项目,将文件上载到FTP服务器。我对传入的数据使用MQTT。因此,对于我订阅的每个主题,我都会保存这些数据,然后将其上载到FTP服务器,为了使事情顺利进行,每次需要上载文件时,我都会使用一个线程来完成这项工作。为了确保程序不会运行太多线程,允许每个主题创建一个线程。我使用了一个变量(比如mutex,但它不是pthread\u mutex\t,

  • 以下是错误日志: 这里有一个相关的问题:https://stackoverflow.com/a/14370767,它建议使用SO_SNDTIMEO套接字选项设置发送超时。

  • 我在使用和PhantomJS驱动程序运行单元测试时遇到了一个问题。它似乎与PhantomJS进程中的stderr/stdout的资源争用有关。错误是: 更多详细信息请参见:https://gist.github.com/lucaswiman/9788422 null

  • 我试图让父进程在父进程继续之前等待多个子进程发出信号,使用未命名信号量数组(每个子进程一个信号量)。但是,当使用sem_wait()时,父进程将无限期地等待,而sem_trywait()返回“资源暂时不可用”错误,并在子进程没有发出信号的情况下继续。sem_init()和sem_post()都不返回错误。 编辑以添加:sem_wait()遇到错误,无论子进程在等待之前还是之后调用sem_post(