1

我正在用 C 语言编写一个可移植的应用程序,它应该可以在 mac 和 windows 上运行,我正在编写的套接字代码是使用 windows 上的 POSIX 套接字 Winsock api 具有类似的功能。

服务器是用java编写的,这是一个客户端应用程序,它连接到服务器然后进行通信,

我需要编写一个 readline 函数,就像我们在 C# 或 Java 中读取由换行符终止的行一样。

我目前正在使用以下功能,但我认为这不是非常有效的方法,因为我正在逐字阅读

    //return number of bytes read or -1 on error
int readline(SOCKET s, char* pResponse)
{
    char c = '0';
    int status = 0;
    int i = 0;

    while(true)
    {
        status = recv(s,&c, 1,0);

        if(status == SOCKET_ERROR)
        {
            //socket error
            return -1;
        }
        else if(status == 0)
        {
            //closed ?
            return -1;
        }
        else if(status > 0)
        {
            pResponse[i] = c;

            i++;

            if(c == '\n' || c == '\r\n')
            {
                break;
            }
        }
    }
    return i;
}

发送方/服务器将只发送这一行并等待来自客户端的响应,因此我们可以假设读取整个套接字数据是可以的

那么我可以写这个比这个更好吗?逐字符读取是性能问题吗?任何帮助,将不胜感激。

4

2 回答 2

3

是的,你可以做得更好。Readline 应该从套接字读取大量数据,如果在第一个 '\n' 之后有任何数据,它应该将该数据留在某个缓冲区中以备后用。这称为“缓冲”,需要扎实的指针和数组知识。

您的套接字库可能已经在为您缓冲,在这种情况下您不需要这样做,但可能不需要。

于 2013-01-05T17:34:22.720 回答
0

当缓冲区中的最后一个字符是 '\r' 而它之前的字符是 '\n' 时,你应该中断。

如果要将缓冲区的内容视为 ac 字符串,则在返回之前将 '\r' 替换为 '\0'。

如果您正在阅读的文件是 dos 文本文件,并且 \r\n 表明它是,请考虑这种情况,文件中的最后一行可能有也可能没有 \r\n。这是您可能会遇到的情况。

于 2013-01-05T17:48:00.800 回答