首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统调用read()被阻塞

系统调用read()被阻塞
EN

Stack Overflow用户
提问于 2020-07-22 00:49:58
回答 1查看 55关注 0票数 0

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

这里是带有系统调用read(..)的完整函数在里面。

代码语言:javascript
复制
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 == '\0') break;
        }
        else
        {
                if (errno == EINTR) continue;
                return -1;
        }
    }
    *buffer = 0;
    return n;
}

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

提前感谢所有人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-22 01:02:44

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

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

代码语言:javascript
复制
int datagram_length = read(sockd, vptr, maxlen - 1);
if (datagram_length < 0) {
    // complain about the error
} else {
    vptr[datagram_length] = 0;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63019247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档