写了一个读取socket数据的函数,但是有有关问题,麻烦帮小弟我看一下
写了一个读取socket数据的函数,但是有问题,麻烦帮我看一下。#define READ_BUF 2048size_t sock_read(int so
写了一个读取socket数据的函数,但是有问题,麻烦帮我看一下。
#define READ_BUF 2048
size_t sock_read(int sockfd,char* recv_buf,size_t buf_len)
{
char read_buf[READ_BUF]={0};
size_t recv_len=0;
size_t recv_total_count=0;
while ((recv_len=read(sockfd,read_buf,READ_BUF))>0)//循环到第二次的时候就阻塞在这了
{
if (recv_total_count+recv_len>buf_len)
{
memset(recv_buf,0,buf_len);
recv_total_count=0;
break;
}
memcpy(recv_buf+recv_total_count,read_buf,recv_len);
recv_total_count+=recv_len;
memset(read_buf,0,READ_BUF);
}
return recv_total_count;
}
函数的功能是读取socket的数据,放到一个buf里面,然后返回数据的长度。
问题出在read(sockfd,read_buf,READ_BUF)这里,第一次都取成功,循环到第二次的时候就阻塞了,一直阻塞。
按道理不应该这样的,我在win下面也是用这种方法是可以用的。在linux上面为什么就不能了呢。
[解决办法]没有数据来的时侯就会阻塞
[解决办法]这本来就应该阻塞,它在等数据到来
[解决办法]#define READ_BUF 2048
阻塞模式每次会读够2048才返回。你可以先接收一个数据长度,再根据这个长度去接收后续数据。
[解决办法]不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
[解决办法]这有socket异步的例子,你可以参考:
http://download.csdn.net/detail/geoff08zhang/4571358