导航:首页 > 编程系统 > linuxrecv

linuxrecv

发布时间:2022-01-19 16:26:24

1. WINDOWS下的send,recv与linux下的send,recv有什么区别

1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.int recv(int sockfd,void *buf,int len,int flags)int send(int sockfd,void *buf,int len,int flags)
前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或发送带外数据 |
| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
| MSG_WAITALL | 等待任何数据 |
|————————————————————–|
如果flags为0,则和read,write一样的操作。
2、在unix中,所有的设备都可以看成是一个文件,所以我们可以用read来读取socket数据。

2. linux 下调用recv函数,死循环在recv函数里面,什么原因

建议你用strace看那几个线程确切是卡在哪里

而且你描述的是,死循环。 recv函数怎么会死循环?

还有,当你的系统压力变大的时候, 会出现epoll提示某socket可用,但是等你去读的时候该socket已经被关闭的情况,你看看这种情况会不会对你的程序造成影响。
----------------------------
man recv
RETURN VALUE
These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an
orderly shutdown.

你可以看到,当对端关闭socket的时候recv返回值是0。 那么作为你的程序,你又没有判断这种情况呢? 你默认的如果是使用EPOLLET模式, 你肯定不停的读socket直到EAGAIN出现,但是如果返回值0的话,并不会出现EAGAIN。

建议你还是多用strace来查询问题所在,有时候比gdb更能直接找出原因。

还有再纠正一点,recv是一个linux系统调用,要么是阻塞要么是返回,不存在死循环的问题的, 死循环肯定是出在你的程序代码中。 如果你觉得recv本身不退出又占用大量cpu,那就是linux库出bug或者是内核bug了。

3. linux 下socket的recv函数返回值问题

说清楚一点,是UDP还是TCP

不管怎么说,在recv之前调用一下select(),检查缓冲到底有没有内容,如果有,再执行recv就不会有任何问题。而且 select的好处是,如果没有接到别的东西,你可以sleep()一下,不占用CPU

用下面的rcv代替你的recv函数吧,我在嵌入式系统开发时自己写的一个标准例程,很可靠:
参数解释:
sck - socket
buf - 接收缓冲区
size-缓冲区大小
time_out-等待时间(按秒计)如果超时则返回
返回值:收到字节数,0表示超时等错误

int rcv(int sck, void * buf, int size, int time_out)
{
if (sck < 1 || !buf || size < 1) return 0;
timeval tv = { 0, 0}; timeval * ptv = 0;
if (time_out > 0) { tv.tv_sec = time_out; ptv = &tv; }
memset(buf, 0, size);
int r = 0; char * b = (char*) buf; int sz = size;
fd_set rd, er; int total = 0; time_t t0 = time(0); time_t t1 = 0;
do {
FD_ZERO(&rd); FD_SET(sck, &rd);
FD_ZERO(&er); FD_SET(sck, &er);
r = select(sck + 1, &rd, 0, &er, ptv);
if (r == -1) { nperror("select()"); return -1; }
if (FD_ISSET(sck, &er)) {
nperror("socket(shutdown)"); return -1;
}//end if
if (FD_ISSET(sck, &rd)) {
r = recv(sck, b, sz, 0);
if (r == -1) { nperror("recv()"); return -1; }
total += r; sz -= r; b+= r;
}//end if
if (time_out > 0)
t1 = time(0) - t0;
else
t1 = time_out - 1;
//end if
}while(sz && t1 < time_out);
return total;
}//end if

4. linux中的socket编程的问题,recv函数收到的全是0

send后,操作系统会决定是不是马山发包还是继续等待看看还有别的send,然后把他们一起打成一个包来发送。所以你recv是不知道要接收几个包的。

5. 简述linux下,从socket写入和读取的函数,read/write和send/recv函数的含义并解释其接口意义简答题

Ssize_t write(int fd,const void *buf,size_t nbytes);
write的返回值大于0,表示写了部分数据或者是全部的数据,这样用一个while循环不断的写入数据,但是循环过程中的buf参数和nbytes参数是我们自己来更新的,返回值小于0,此时出错了,需要根据错误类型进行相应的处理
Ssize_t read(int fd,void *buf,size_t nbyte)
Read函数是负责从fd中读取内容,当读取成功时,read返回实际读取到的字节数,如果返回值是0,表示已经读取到文件的结束了,小于0表示是读取错误。
Recv函数和send函数
Recv函数和read函数提供了read和write函数一样的功能,不同的是他们提供了四个参数。
Int
recv(int fd,void *buf,int len,int flags)
Int
send(int fd,void *buf,int len,int flags)
前面的三个参数和read、write函数是一样的。第四个参数可以是0或者是一下组合:
MSG_DONTROUTE:不查找表
是send函数使用的标志,这个标志告诉IP,目的主机在本地网络上,没有必要查找表,这个标志一般用在网络诊断和路由程序里面。
MSG_OOB:接受或者发生带外数据
表示可以接收和发送带外数据。
MSG_PEEK:查看数据,并不从系统缓冲区移走数据
是recv函数使用的标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容。这样在下次读取的时候,依然是一样的内容,一般在有过个进程读写数据的时候使用这个标志。
MSG_WAITALL:等待所有数据
是recv函数的使用标志,表示等到所有的信息到达时才返回,使用这个标志的时候,recv返回一直阻塞,直到指定的条件满足时,或者是发生了错误。

6. linux epoll socket recv 不能获取正确的数据

能多点信息吗?
也不知道你epoll参数设好了没,你用的tcp还是udp....

先别用epoll,等你正常send和recv之后,再用epoll或者poll。

这样才能确定是send,recv的问题还是epoll阻塞的问题

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

你好
recv函数只是在用户空间定义的。内核空间有与之对应的函数,也就回是说,执行答recv函数就会调用到内核中与它对应的函数,实际起作用的就是内核里的这个函数。
至于内核里调用的是那个函数,你不需要是找,那样会把你看晕的,内核里的调用关系复杂的很,除非对内核非常了解的,才会找到到底是怎么调用的,他也是只是找到怎么调用的,至于为什么这样调用是极少人知道的。得问linux的开发者。因为内核的代码量是太多了。有人花了三年时间才看完内核代码。

souce insight只能查找内核里有的东西,属于内核的。recv()函数是不属于内核的,所以用这个是查找不到的

希望可以帮到你,望选为满意答案

8. 简述linux下,从socket写入和读取的函数,read/write和send/recv函数的含义并解释其接口意义。

没理解楼主意思,楼主可以搜搜IP/TCP编程模型(socket网络编程),大概就是要有一个sever端和一个client端,read/write一般是对本地文件的读取/写入,然后send/recv是sever端和client端互相发送数据使用的,具体程序网上搜搜这方面吧 我手头没有现成的 希望对你有帮助

9. linux中read,write和recv,send的区别

Linux的recv、send函数和read、write函数都可以用于套接字编程。
区别:
1、recv、send只用于套接字通信;
2、read、write是底层系统调用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符属于是文件描述符的一种,套接字本身在Linux上就叫做套接字文件。
所以read、write函数不光可以用于套接字编程,也可以用于读取其他各种文件,比如用于文件编程读写普通文件。

10. 在linux中,用netstat会看到Send-Q和Recv-Q,通常为零,如果文件积压过多,那么Send-Q和Recv-Q数值会增大

Linux的CMD,你应该写自己的函数来发送相应的数据类型来接受的结果集

阅读全文

与linuxrecv相关的资料

热点内容
运动鞋买鞋上什么app 浏览:904
NSA工具下载 浏览:918
函数代码在哪个文件夹 浏览:213
微信应用怎么代码添加快捷方式 浏览:371
用数据说话是最有力的什么 浏览:27
图片文件被锁定无法打开 浏览:768
wr886nv2升级 浏览:490
移动硬盘视频文件无法删除 浏览:417
如何查看网络监控 浏览:132
打印机如何连接到网络打印机 浏览:181
vmlinux安装tools 浏览:768
波形文件转mp3 浏览:803
linux查看网络 浏览:163
如何从cad软件里打印命令文件 浏览:247
clover780ti黑苹果 浏览:928
丙烷数据表哪里有 浏览:72
一直生成photo文件夹 浏览:14
为什么编程语言都是world 浏览:489
轻颜相机在手机里的哪个文件夹 浏览:547
王者什么时候版本更新 浏览:123

友情链接