你好
recv函数只是在用户空间定义的。内核空间有与之对应的函数,也就是说,执行recv函数就会调用到内核中与它对应的函数,实际起作用的就是内核里的这个函数。
至于内核里调用的是那个函数,你不需要是找,那样会把你看晕的,内核里的调用关系复杂的很,除非对内核非常了解的,才会找到到底是怎么调用的,他也是只是找到怎么调用的,至于为什么这样调用是极少人知道的。得问linux的开发者。因为内核的代码量是太多了。有人花了三年时间才看完内核代码。
souce insight只能查找内核里有的东西,属于内核的。recv()函数是不属于内核的,所以用这个是查找不到的
希望可以帮到你,望选为满意答案
》为什么char recvbuf[65536];改为char recvbuf[1024];
》客户端接收到的文件为0字节?
改了这个后面recving=recv(clientsocket,recvbuf,65536,0);也要修改为
recving=recv(clientsocket,recvbuf,1024,0);
不然你会内存越界了
》recv函数第2和3参数是干什么的
第二参数是接收数据缓冲区的地址,第三参数是这个缓冲区最多能放多少个字节
》和在for里面为什么需要加recved+=recving; 这段
因为要接受的文件比较大,每次recv读出来的数据最多(也可能少)是recv第三个参数那么多个字节(受缓冲区大小限制),也就是多次读取数据,累计已读取了多少,和文件实际大小比较,以确定是否传输完毕。
需要将recv设置超时,Linux下设置超时如下:
//设置发送超时
struct timeval timeout={3,0};//3s
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char )&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char )&timeout,sizeof(struct timeval));
windows下设置超时如下:
int timeout = 3000; //3s
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));
int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)