读书人

linux网络编程客户端recv()函数解

发布时间: 2012-08-22 09:50:34 作者: rapoo

linux网络编程,客户端recv()函数
我在服务器端使用send()发送数据,在客户端使用while( recv(sockfd,databuf,1024,0) > 0){ }来接收数据
当服务器端发送完数据之后数据之后,客户端并不能结束while循环,recv函数被阻塞。
怎么样才能让客户端接收完数据后跳出循环?

另外,我尝试着使用客户端使用一个特定的字符串来作为结束标志,例如"\r\n",就是服务器端在数据发送完成之后,发送一个结束标志;客户端在while循环里面来一次判断来结束while循环。可是这样也行不通,有时候结束标志会被客户端读到最后一批数据的后面,即结束标志字符串不在databuffer 的首位置,所以无法判断结束标志,从而导致死循环。

[解决办法]
将你的socket改为非阻塞的。recv就不阻塞了。
[解决办法]
肯定是阻塞的,这个必须的,其次楼主应该始终使用一个buffer,每次读到的数据都追加到数组末尾,然后调一次strstr找\r\n,找不到就继续读,找到了就把这一段输出,并把\r\n之后的数据memmove到数组头部,继续循环即可。

别忘记strstr之前先写个'\0',或者你自己写个字符串查找防越界也OK。
[解决办法]
你的是阻塞的socket,设置成非阻塞的。
[解决办法]

探讨

肯定是阻塞的,这个必须的,其次楼主应该始终使用一个buffer,每次读到的数据都追加到数组末尾,然后调一次strstr找\r\n,找不到就继续读,找到了就把这一段输出,并把\r\n之后的数据memmove到数组头部,继续循环即可。

别忘记strstr之前先写个'\0',或者你自己写个字符串查找防越界也OK。

[解决办法]
你怎么知道你是一直被阻塞了,还是接收失败(返回-1<0),然后再堵塞的,导致程序没结束了。另外你发送的ip和端口是否是你和你接收的ip和端口一至,不一致肯定死都接收不到数据,就一直堵塞了。

[解决办法]
while( send(sockfd,databuf,1024,0) == 0){break; }

另外服务端建立父子进程 fork(),在外面再套个while,可实现基本的父子进程socket
[解决办法]
探讨

引用:
引用:

肯定是阻塞的,这个必须的,其次楼主应该始终使用一个buffer,每次读到的数据都追加到数组末尾,然后调一次strstr找\r\n,找不到就继续读,找到了就把这一段输出,并把\r\n之后的数据memmove到数组头部,继续循环即可。

别忘记strstr之前先写个'\0',或者你自己写个字符串查找防越界也OK。


提醒,strs……

[解决办法]
本来客户端就是应该单独开个线程死循环读取的,如果担心占CPU太多,可以非阻塞+sleep你非要跳出循环干什么啊?

读书人网 >C语言

热点推荐