套接字读取和未知长度数据

时间:2011-01-22 18:50:23

标签: c sockets unix

我正在尝试用C编写代码,其中我想从套接字读取数据,但我不知道数据的长度。我无法控制数据发送方。

有没有办法用未知长度读取套接字读取?

以下是我编写的代码,但它挂在read()

static void
process_command ( int fd ) {
    fprintf ( stderr, "process_command\n" );
    char *buffer = ( char * ) malloc ( sizeof ( char ) * SIZE_TO_READ );
    int n  = 0;
    while ( 1 ) {
        fprintf ( stderr, "." );
        n = read ( fd, buffer, SIZE_TO_READ );
        fprintf ( stderr, "bytes read = %d \n", n );
        if ( n <= 0 || n == -1 )
            break;
        buffer = ( char * ) realloc ( buffer, n + SIZE_TO_READ );
    }
    char * p = strchr ( buffer, '\n' );
    if ( p ) *p = '\0';
    fprintf ( stderr, "-----> %s\n", buffer );
    if ( buffer ) free ( buffer );
}
在这种情况下,

fd是FILENO_STDIN

3 个答案:

答案 0 :(得分:5)

只需读取某些块(缓冲区),直到它返回0,否则您将看到根据协议存在数据结束。

答案 1 :(得分:2)

没有任何方法可以知道预期会有多少字节。大多数协议都有一些指定数据长度或数据终止符的方法。您正在实施什么样的协议?

答案 2 :(得分:1)

SOCK_NONBLOCK传递给socket()(或稍后通过fcntl()致电O_NONBLOCK),以使套接字操作无阻塞。如果没有要读取的数据(还),这将导致read()调用失败,无论是EAGAIN还是EWOULDBLOCK(实际上都是相同的)。

或者,您可以使用select()确定在实际read()呼叫之前是否有任何数据可以在特定套接字上读取。