×

recv

拦截到的recv数据不对?recv未激活是什么意思

admin admin 发表于2023-12-21 22:39:54 浏览45 评论0

抢沙发发表评论

大家好,如果您还对recv不太了解,没有关系,今天就由本站为大家分享recv的知识,包括拦截到的recv数据不对的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

拦截到的recv数据不对

可能是recv的数据过大,缓冲区无法正常读写了。 recv()是编程语言函数。函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时:(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

recv未激活是什么意思

指的是编程语言函数未激活,不能使用。recv如果未激活,可在电脑使用的程序设计软件中点击帮助,查找recv激活的方法,若碰到帮助无法理解的情况,建议将语言改成简体中文,这样可以方便问题的查找,实在是激活不了的话,建议向懂编程的专业人士咨询解决。函数式编程语言有很多种定义,宽泛的认为支持高阶函数就算函数式语言的话,大多数现代语言都是支持函数式编程的,例如C/C++,java,C#,lua,python,JavaScript,Scala等等。收紧一下定义的话,加入函数式语言要求的模式匹配,无副作用等要求,那么剩下的就是纯函数式语言,比较常见的有Haskell,Clean等。

c语言的recv()非阻塞方法怎么弄哦

需要将recv设置超时,Linux下设置超时如下://设置发送超时struct timeval timeout={3,0};//3ssetsockopt(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; //3sint ret=setsockopt(sock_fd,SOL_SOCKET,SO_SNDTIMEO,&timeout,sizeof(timeout));int ret=setsockopt(sock_fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout));

recv()和recvfrom()有什么区别

recv()()和recvfrom()区别是:含义不同、用法不同、侧重点不同 

一、含义不同

recv

abbr. 接收;收到(receive)。

recv from

收到来自…。

二、用法不同

recv

receive的基本意思是“接受”“收到”,仅指接到或收到某物的客观事实,而不表示主观态度(接受或拒绝)。引申表示“受到教育、惩罚、支持等”“赞同某一意见或看法”。有时还可表示“接见某人”。

Ipfw add allow tcp from to in recv.

添加和除去规则例子:。

L2TP : Zero check error when recv call control message.

第三个表明收到的控制报文中存在应该为0的位不为0的情况。

The placeholder prefix is SEND for Send connectors or RECV for Receive connectors.

占位符prefix为SEND(对于发送连接器)或RECV(对于接收连接器)。

recv from

receive from/of的意思是“从某处或某人那收到(款项)”,如received from/of Sam seven pounds。

I received a cable from New York.

我收到一封从纽约来的电报。

We receive a fax of the order this morning.

我们今天上午收到一份传真订单。

Do you save letters and cards that you receive from friends and relatives?

您有收藏您所收到的朋友的和亲人的信件、卡片吗?

三、侧重点不同 

recv

仅指接到或收到某物的客观事实,而不表示主观态度(接受或拒绝)。

recv from

从某处或某人那收到(款项)。

recvfrom()的recvfrom

recvfrom  recvfrom函数(经socket接收数据):函数原型:int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen);相关函数 recv,recvmsg,send,sendto,socket函数说明:recv()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.返回值:成功则返回接收到的字符数,失败返回-1.错误代码EBADF 参数s非合法的socket处理代码EFAULT 参数中有一指针指向无法存取的内存空间。ENOTSOCK 参数s为一文件描述词,非socket。EINTR 被信号所中断。EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。ENOBUFS 系统的缓冲内存不足ENOMEM 核心内存不足EINVAL 传给系统调用的参数不正确。范例/*利用socket的UDP client此程序会连线UDP server,并将键盘输入的字符串传给server。UDP server 范例请参考sendto()。*/#include《sys/stat.h》#include《fcntl.h》#include《unistd.h》#include《sys/typs.h》#include《sys/socket.h》#include《netinet/in.h》#include《arpa/inet.h》#define PORT 2345#define SERVER_IP “127.0.0.1”main(){int s,len;struct sockaddr_in addr;int addr_len =sizeof(struct sockaddr_in);char buffer;/* 建立socket*/if((s = socket(AF_INET,SOCK_DGRAM,0))《0){perror(“socket”);exit(1);}/* 填写sockaddr_in*/bzero(&addr,sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.s_addr = inet_addr(SERVER_IP);while(1){bzero(buffer,sizeof(buffer));/* 从标准输入设备取得字符串*/len =read(STDIN_FILENO,buffer,sizeof(buffer));/* 将字符串传送给server端*/sendto(s,buffer,len,0,&addr,addr_len);/* 接收server端返回的字符串*/len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);printf(“receive: %s”,buffer);}}执行 (先执行udp server 再执行udp client)hello /*从键盘输入字符串*/receive: hello /*server端返回来的字符串*/

请教recv 和 recvfrom的区别

不太清楚,recv一般用于tcp,因为tcp有有链接的,在recv调用中不需要知道对方是谁。recvfrom一般用于udp,参数中可以传回对方是谁的信息。

linux手册翻译——recv(2)

recv, recvfrom, recvmsg - receive a message from a socket

recv()、recvfrom() 和 recvmsg() 调用用于从套接字接收消息。 它们可用于在UDP和TCP的套接字上接收数据。 本页首先介绍了所有三个系统调用的共同特点,然后介绍了调用之间的区别。

recv() 和 read(2) 之间的唯一区别是 flags 的存在。 使用零标志参数,recv() 通常等效于 read(2) (但请参阅 NOTES),且 recv(sockfd, buf, len, flags); 等价于 recvfrom(sockfd, buf, len, flags, NULL, NULL);

所有三个调用都在成功完成时返回消息的长度。 如果消息太长而无法放入提供的缓冲区,则 可能 会丢弃多余的字节,具体 取决于接收消息的套接字类型 ,显然TCP是不可能丢弃的。

如果套接字上没有可用消息,则接收调用将等待消息到达,除非套接字是非阻塞的(请参阅 fcntl(2)),在这种情况下,将返回值 -1 并将 errno 设置为 EAGAIN 或 EWOULDBLOCK。 recv_()调用通常会返回任何可用的数据,只要拿到数据就会立马返回,最多返回指定缓冲区大小的数据,但是并不会等待到让缓冲区满 ,除非设置了 MSG_WAITALL 标志,见下。

应用程序可以使用 select(2)、poll(2) 或 epoll(7) 来确定更多数据何时到达。

The flags argument is formed by ORing one or more of the following values:

ee_errno contains the errno number of the queued error. ee_origin is the origin code of where the error originated. The other fields are protocol-specific. The macro SOCK_EE_OFFENDER returns a pointer to the address of the network object where the error originated from given a pointer to the ancillary message. If this address is not known, the sa_family member of the sockaddr contains AF_UNSPEC and the other fields of the sockaddr are undefined. The payload of the packet that caused the error is passed as normal data. For local errors, no address is passed (this can be checked with the cmsg_len member of the cmsghdr ). For error receives, the MSG_ERRQUEUE flag is set in the msghdr . After an error has been passed, the pending socket error is regenerated based on the next queued error and will be passed on the next socket operation.

recvfrom() 将接收到的消息放入缓冲区 buf 。 调用者必须在 len 中指定缓冲区的大小。

如果调用者希望拿到消息的原地址, 并且底层协议可以提供消息的源地址时,应将 src_addr 设置为指向用于接收消息原地址的缓冲区。 在这种情况下, addrlen 是一个 value-result 参数。 在调用之前,它应该被初始化为与 src_addr 关联的缓冲区的大小。 返回时,addrlen 被更新以包含源地址的实际大小。 如果提供的缓冲区太小,则截断返回的地址; 在这种情况下, addrlen 将返回一个大于提供给调用的值。

如果调用者对源地址不感兴趣,则应将 src_addr 和 addrlen 指定为 NULL。

ssize_t recv(int sockfd, void* buf, size_t len, int flags); recv() 调用通常仅用于已连接的套接字(请参阅 connect(2))。 相当于调用: recvfrom(fd, buf, len, flags, NULL, 0);

ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags); recvmsg() 调用使用 msghdr 结构来 最小化直接提供的参数数量 。 这个结构在 《sys/socket.h》 中定义如下:

msg_name 字段指向调用者分配的缓冲区,如果套接字未连接( 特指UDP的服务端 ),则该缓冲区用于返回源地址。 调用者应在此调用之前将 msg_namelen 设置为此缓冲区的大小; 从成功调用返回后,msg_namelen 将包含返回地址的长度。 如果应用程序不需要知道源地址,可以将 msg_name 指定为 NULL。

The fields msg_iov and msg_iovlen describe scatter-gather locations, as discussed in readv(2). 需要注意的是 msg_iov 和 msg_iovlen 描述了一个 struct iovec 类型的数组, msg_iovlen 表示数组的元素个数,而struct iovec则是描述了一个缓冲区

字段 msg_control 指向用于其他协议控制相关消息或杂项辅助数据的缓冲区。 当recvmsg()被调用时, msg_controllen 为 msg_contro l中可用缓冲区的长度; 从成功调用返回时,它将被设置为控制消息序列的长度。

控制消息的格式为:

只能通过 cmsg(3) 中定义的宏访问辅助数据。

例如,Linux 使用这种辅助数据机制通过 UNIX 域套接字传递扩展错误、IP 选项或文件描述符。 有关在各种套接字域中使用辅助数据的更多信息,请参阅 unix(7) 和 ip(7)。

msghdr 中的 msg_flags 字段在 recvmsg() 返回时设置 。 它可以包含几个标志:

这些调用返回接收到的字节数,如果发生错误,则返回 -1。 如果发生错误,则设置 errno 以指示错误。

当流套接字对等端执行有序关闭(orderly shutdown)时,返回值将为 0(传统的“文件结束”返回)。

各种域(例如 UNIX 和 Internet 域)中的数据报套接字允许零长度数据报。 当收到这样的数据报时,返回值为 0。

如果从流套接字接收的请求字节数为 0,则也可能返回值 0。

这些是套接字层生成的一些标准错误。 底层协议模块可能会产生和返回额外的错误; 查看他们的手册页。

POSIX.1-2001, POSIX.1-2008, 4.4BSD (these interfaces first appeared in 4.2BSD).

POSIX.1 describes only the MSG_OOB, MSG_PEEK, and MSG_WAITALL flags.

如果零长度数据报未决,则带有零标志参数的 read(2) 和 recv() 提供不同的行为。 在这种情况下, read(2) 不起作用(数据报保持挂起),而 recv() 消耗挂起的数据报。

socklen_t 类型是由 POSIX 发明的。 另见 accept(2) 。

根据 POSIX.1,msghdr 结构的 msg_controllen 字段类型为 socklen_t,而 msg_iovlen 字段类型为 int,但 glibc 目前将两者设置为 size_t。

有关可用于在单个调用中接收多个数据报的 Linux 特定系统调用的信息,请参阅 recvmmsg(2)。

getaddrinfo(3) 中显示了使用 recv() 的示例。

socket编程中write,read和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数据

C++ socket connect成功后,recv等待130秒后返回10054请问如何解决

看字面情形,你用的是异步SOCKET,这时connect是异步的,调出使用之后,应当通过回调,或设置同步等待操作,来获知Connect的真实状态。

unix C语言关于socket的recv和send的问题,代码中也有问题

你的代码其实没有任何问题,之所以 server 没有打印,是由于server最后打印时的代码是printf("%s",buff);把它改成printf("%s\n",buff);即可。 标准输出是行缓冲的,所以如果打印的内容没有 \n 了话,内容不会真正打印出来,而是留在缓冲中。至于你client打印时printf("recv from server :%s", buff);虽然没有在后面加 \n, 但是你从server发到client的消息里已经带有 \n 了,所以这里没出问题。关于标准输入输出缓冲相关的更多细节,自己搜一下吧。htons和inet_aton有什么区别?htons 是把 主机使用的字节序转成网络字节序 (即入参是整数,返回值也是整数)而 inet_aton 是吧 ascii 字符串形式的IP地址 转换成 网络字节序的整数。 自己去搜一下网络字节序相关信息。

OK,关于recv和拦截到的recv数据不对的内容到此结束了,希望对大家有所帮助。