socket网络编程,如何只接收到回车换行符?

时间:2022-05-28 23:46:03
如何实现一行行的接收。谢谢。不用一个个字符判断吧,那样是不是效率太低了?

7 个解决方案

#1


socket面向的是字节流,而不是字符串,所以你的要求无法达到

想不要自己写代码,可以使用sscanf,这样可以快速的检索到换行符。

要么你就要约定对方每一次发送都要是一个完整的行(这个在tcp通讯里面很难保证,譬如超长的行会被拆分),不过依然麻烦。

#2


没办法,你只能自己去处理

#3


必须一个个的接收,如果自己不想判断可以使用
fdopen打开套接字,返回流缓冲的FILE指针,然后使用fgets函数

欢迎访问LINUX下C语言编程网站 www.linuxc.net

#4


发送端预处理,一行一行的发。

或者接收端将接收到的数据存入文件,然后利用fgets或者fscanf按行读取。

#5


CPU处理字符串就不用考虑效率了吧
与外设打一次交道就够处理好几百个字符串了

你收到回车换行就不收,那么剩下的呢?扔了?
做个串分析吧,也不难,更用不着考虑什么效率

#6


没办法,只能自己处理,即使对方一行一行的发,还是有可能出现一次收到两次发送的数据
这种情况一般的处理方法是接收函数只管收,处理时使用一个暂存缓冲区buffer和一个while循环
onmessage(char* strmsg)
{
   if (buffer != NULL && *buffer != 0) strmsg = 将strmsg内容追加到buffer之后;

   while (*strmsg != 0)
   {
      //开始处理
      //首先判断收到的信息是否完整,假设使用\r\n分隔
      char* p = strstr(strmsg, "\r\n");
      if (p == NULL)
      {
          //不够长,放入缓冲区,继续接收
          strcpy(buffer, strmsg);
          break;
      }
      //处理

     //处理完毕,指针前进,由协议确定,如使用\r\n分隔
     strmsg = strstr(strmsg, "\r\n") + 2;
   }
   if (*strmsg == 0) 清空缓存
}

大体写了一下意思,可以参考,具体处理稍微麻烦一点,要处理缓冲区的内存分配等

#7


用TCP协议,不要了吧!用UDP就可以了。

#1


socket面向的是字节流,而不是字符串,所以你的要求无法达到

想不要自己写代码,可以使用sscanf,这样可以快速的检索到换行符。

要么你就要约定对方每一次发送都要是一个完整的行(这个在tcp通讯里面很难保证,譬如超长的行会被拆分),不过依然麻烦。

#2


没办法,你只能自己去处理

#3


必须一个个的接收,如果自己不想判断可以使用
fdopen打开套接字,返回流缓冲的FILE指针,然后使用fgets函数

欢迎访问LINUX下C语言编程网站 www.linuxc.net

#4


发送端预处理,一行一行的发。

或者接收端将接收到的数据存入文件,然后利用fgets或者fscanf按行读取。

#5


CPU处理字符串就不用考虑效率了吧
与外设打一次交道就够处理好几百个字符串了

你收到回车换行就不收,那么剩下的呢?扔了?
做个串分析吧,也不难,更用不着考虑什么效率

#6


没办法,只能自己处理,即使对方一行一行的发,还是有可能出现一次收到两次发送的数据
这种情况一般的处理方法是接收函数只管收,处理时使用一个暂存缓冲区buffer和一个while循环
onmessage(char* strmsg)
{
   if (buffer != NULL && *buffer != 0) strmsg = 将strmsg内容追加到buffer之后;

   while (*strmsg != 0)
   {
      //开始处理
      //首先判断收到的信息是否完整,假设使用\r\n分隔
      char* p = strstr(strmsg, "\r\n");
      if (p == NULL)
      {
          //不够长,放入缓冲区,继续接收
          strcpy(buffer, strmsg);
          break;
      }
      //处理

     //处理完毕,指针前进,由协议确定,如使用\r\n分隔
     strmsg = strstr(strmsg, "\r\n") + 2;
   }
   if (*strmsg == 0) 清空缓存
}

大体写了一下意思,可以参考,具体处理稍微麻烦一点,要处理缓冲区的内存分配等

#7


用TCP协议,不要了吧!用UDP就可以了。