Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。

Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。,第1张

你好

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));

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12175668.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存