我正在用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;
}
发件人/服务器只发送此行并等待来自客户端的响应,因此我们可以假设可以读取整个套接字数据
那么我能比这更好地写这个吗?正在通过char读取性能问题?任何帮助将不胜感激。
答案 0 :(得分:2)
是的,你可以做得更好。 Readline应该从套接字读取大量数据,如果在第一个'\ n'之后有任何数据,它应该将该数据留在某个缓冲区中供以后使用。这称为“缓冲”,需要扎实的指针和数组知识。
您的套接字库可能已经在为您缓冲,在这种情况下您不需要这样做,但可能不是。
答案 1 :(得分:0)
当缓冲区中的最后一个字符为'\ r'且前面的字符为'\ n'时,你应该中断。
如果要将缓冲区的内容视为c字符串,则在返回之前将'\ _'替换为'\ _'。
如果您正在阅读的文件是dos文本文件,并且\ r \ n建议它是,请考虑这种情况,文件中的最后一行可能或可能没有\ r \ n。这是你可能遇到的情况。