系统调用 read() 阻塞

System-call read() blocked

我有一个客户端需要在套接字上读取服务器发送的字符序列。 客户端使用系统调用 read() 读取套接字 SOCK_DGRAM.

这里是包含系统调用 read(..) 的完整函数。

ssize_t readLine(int sockd, void *vptr, size_t maxlen)
{
    ssize_t n, rc;
    char    c, *buffer;
    buffer = vptr;

    for ( n = 1; n < maxlen; n++ ) 
    {

        rc = read(sockd, &c, 1);
        if ( rc == 1 ) 
        {
            *buffer++ = c;
            if (c == '[=10=]') break;
        }
        else
        {
                if (errno == EINTR) continue;
                return -1;
        }
    }
    *buffer = 0;
    return n;
}

问题是,如果服务器发送像这样的 ABCDEF'\0' 的字符序列,则此客户端只读 A,然后系统调用 read() 进入阻塞模式。 我已经使用 Wireshark 查看服务器是否运行良好,它是否在 UDP 数据包中正确发送 ABCDEF'\0'。从这个角度来看都还可以。

在此先感谢大家。

使用数据报套接字,您需要一次读取和写入整个数据报。

如果您没有给 read 足够的 space 来读取整个数据报,数据报的其余部分就会消失。

int datagram_length = read(sockd, vptr, maxlen - 1);
if (datagram_length < 0) {
    // complain about the error
} else {
    vptr[datagram_length] = 0;
}