c - 编写 C 套接字 readline() 函数

标签 c sockets

我正在用 C 语言编写一个可移植应用程序,它应该可以在 Mac 和 Windows 上运行, 我正在编写的套接字代码使用 POSIX 套接字 Windows 上的 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;
}

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

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

最佳答案

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

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

关于c - 编写 C 套接字 readline() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174388/

相关文章:

java - 调整 Java 套接字的性能

c - 需要帮助编译 C 源代码

c - 服务器的线程与客户端实现通信

c - 浮点缓冲区转换为 unsigned char* 在套接字发送时丢失数据

c - 如何使用 select() 知道新客户端是否正在连接到套接字

java - android套接字等待传入数据的指定时间

c - 使用堆栈平衡括号

c - 结构声明后括号中的数字是什么意思?

c - 如何构建嵌入式软件的源代码

c - 在 Ubuntu 上,setsockopt(...) 无法识别 IPPROTO_IP 的 IP_TTL