首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么套接字中的recv()函数不返回任何内容?

套接字中的recv()函数不返回任何内容可能有以下几个原因:

  1. 没有数据可接收:recv()函数是用于接收数据的,如果在调用recv()函数时,套接字缓冲区中没有数据可接收,那么函数将会阻塞,直到有数据到达为止。因此,如果recv()函数不返回任何内容,可能是因为在调用时没有数据可接收。
  2. 数据被丢弃:在某些情况下,数据可能会在网络传输过程中丢失。这可能是由于网络拥塞、传输错误或其他原因导致的。如果数据在传输过程中丢失,那么recv()函数将无法接收到任何内容。
  3. 错误发生:在调用recv()函数时,可能会发生一些错误,导致函数无法正常接收数据。例如,套接字可能已关闭、连接已断开或发生了其他错误。在这种情况下,recv()函数可能不会返回任何内容。

为了解决这个问题,可以采取以下措施:

  1. 检查套接字状态:在调用recv()函数之前,可以先检查套接字的状态,确保连接仍然有效,并且有数据可接收。可以使用套接字的状态标志或其他相关函数来进行检查。
  2. 错误处理:在调用recv()函数后,需要检查函数的返回值,以确定是否发生了错误。如果recv()函数返回-1,表示发生了错误,可以通过查看errno变量来获取具体的错误信息。根据错误类型采取相应的处理措施。
  3. 超时设置:如果recv()函数长时间阻塞而没有返回任何内容,可以考虑设置超时时间。可以使用套接字选项或其他相关函数来设置接收超时时间,以避免长时间的阻塞。

总结起来,套接字中的recv()函数不返回任何内容可能是由于没有数据可接收、数据丢失或发生错误等原因。在使用recv()函数时,需要注意检查套接字状态、处理错误和设置超时时间,以确保能够正确接收数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

socket阻塞与非阻塞,同步与异步、IO模型

例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。...在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...第四次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。...当调用该函数时,套接字会自动地设置为非阻塞方式。 由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

3.1K30

完成端口与线程池的关系_端口触发

2.在GetQueuedCompletionStatus中,没有错误,但总是返回读取的字数为0。I/O重叠结构中也收不到任何字符。...这时候我就在这里用了一下recv()函数,在recv中却可以收到来自客户端发送的数据。难道每次都要自己recv()?肯定不是!如果那样还用扩展的I/O结果何用。...AcceptEx和accept主要的区别就在于接收套接字: accept函数是等待客户连接进来之后才创建套接字,虽然在我们看到的就是一个socket函数,但是在函数背后,系统应该会消耗不少资源...对于第4步,为什么要获取AcceptEx的指针,而不是直接就调用AcceptEx这个函数呢?网上找到的资料是这么说的: Winsock2的其他供应商不一定会实现AcceptEx函数。...版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

94130
  • 【计网】自定义协议与序列化(一) —— Socket封装于服务器端改写

    随后缓冲区就会定期的向磁盘文件中刷新数据。   这个我们在系统部分已经说过了,但是为什么要说这个呢?实际上,如果今天,我们把磁盘这个外设换为网络,实际上就变成了网络通信!...所以 在传输层看来,是双方的操作系统在进行通信! 随后,对端的接收缓冲区就会通过 read/recv 等接口将数据拷贝到应用层,所以 read/recv 接口本质也是拷贝函数!...最后将序列化的字符串交给上层,上层再根据协议进行反序列化,最终拿到相应的数据。   如果对端接收缓冲区内没有数据,那么 read/recv 接口就会阻塞等待,为什么会阻塞等待?...Tcp套接字部分,对于具体的任务是如何处理的虽然TcpServer不该关心,但是如何分配任务以及分配任务的方式是我们需要操心的,在上一篇文章中我们有四种分配方式,后面三种选择任何一种都可,在这里我选择多线程的方式分配任务...,由于在TcpServer中,我们重写了Accept()方法,所以我们不需要在Loop中写裸的accept()原生接口了,我们直接使用_listensock进行调用Accept()方法,会返回一个TcpSocket

    14110

    Python 网络编程

    其实很简单,在Python 中,我们用 socket 模块中socket() 函数 来创建套接字,语法格式如下: import socket socket.socket(family, type, proto...SOCK_STREAM (流式套接字,主要用于 TCP 协议) 或SOCK_DGRAM (数据报套接字,主要用于 UDP 协议) protocol: 一般不填默认为 0 创建 Socket(套接字)...socket.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 socket.recv() 接收TCP数据,数据以字符串形式返回,...flag提供有关消息的其他信息,通常可以忽略。 socket.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    1.5K20

    肝!Python 网络编程

    其实很简单,在Python 中,我们用 socket 模块中socket() 函数 来创建套接字,语法格式如下: import socket socket.socket(family, type, proto...SOCK_STREAM (流式套接字,主要用于 TCP 协议) 或SOCK_DGRAM (数据报套接字,主要用于 UDP 协议) protocol: 一般不填默认为 0 创建 Socket(套接字)...socket.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公共用途的套接字函数 socket.recv() 接收TCP数据,数据以字符串形式返回,...flag提供有关消息的其他信息,通常可以忽略。 socket.send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    1.2K30

    30天拿下Python之使用网络

    在本专栏中,我们将只介绍比较基础的套接字编程和socketserver。 套接字编程 套接字是用于在计算机之间进行通信的基本接口。...函数 含义 socket() 创建一个新的套接字对象。 bind() 将套接字绑定到指定的地址(IP地址和端口号)。 listen() 开始在套接字上监听传入的TCP连接。...sendto() 向连接的服务器发送UDP数据,并指定数据和接收者的地址。 getsockname() 返回套接字自身的地址,返回值通常是元组(ip, port)。...getpeername() 返回连接的对端地址,返回值通常是元组(ip, port)。 setsockopt() 设置套接字的选项。 getsockopt() 获取套接字的选项。...非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。 接下来,我们介绍几个比较重要的套接字函数。

    11810

    Python Socket 编程详细介绍(转)

    客户端 Socket 函数 Socket 函数 描述 s.connect(address) 链接到address处的套接字,一般address的格式为tuple(host, port),如果链接出错,则返回...函数 描述 s.recv(bufsize[, flag]) 接受TCP套接字的数据,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息,通常可以忽略 s.send...(string[, flag]) 发送TCP数据,将字符串中的数据发送到链接的套接字,返回值是要发送的字节数量,该数量可能小于string的字节大小 s.sendall(string[, flag])...完整发送TCP数据,将字符串中的数据发送到链接的套接字,但在返回之前尝试发送所有数据。...非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

    3.9K20

    c语言网络通信_c语言tcp网络编程

    WinSock通讯的所有数据传输,都是通过套接字来完成的,套接字包含了两个信息,一个是IP地址,一个是Port端口号,使用这两个信息,就可以确定网络中的任何一个通讯节点。...可以参考教材计算机网络(第6版)295页图6-32所示的系统调用使用顺序: 注意:上面的代码没有任何检查函数返回值,如果你作网络编程就一定要检查任何一个WinSock API函数的调用结果...上面介绍的函数,返回值类型是int的话,如果函数调用失败的话,返回的都是SOCKET_ERROR。...()); 5:用返回的套接字和客户端进行通信(send()/recv()); 6:返回,等待另一连接请求; 7:关闭套接字,关闭加载的套接字库(closesocket...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    8.4K20

    socket阻塞与非阻塞,同步与异步、IO模型

    例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。...在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...第四次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。...当调用该函数时,套接字会自动地设置为非阻塞方式。   由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    2.2K20

    select 函数:如何同时感知多个IO事件

    我们可以把标准输入、套接字等都看做 I/O 的一路,多路复用的意思,就是在任何一路 I/O 有“事件”发生的情况下,通知应用程序去处理相应的 I/O 事件,这样我们的程序就变成了“多面手”,在同一时刻仿佛可以处理多个..., const struct timeval *timeout);返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1在这个函数中,maxfd 表示的是待测试的描述符基数,它的值是待测试的最大描述符加...第二个可能是设置一个非零的值,这个表示等待固定的一段时间后从 select 阻塞调用中返回。第三个可能是将 tv_sec 和 tv_usec 都设置成 0,表示根本不等待,检测完毕立即返回。...第三种情况是针对一个监听套接字而言的,有已经完成的连接建立,此时使用 accept 函数去执行不会阻塞,直接返回已经完成的连接。...第四种情况是套接字有错误待处理,使用 read 函数去执行读操作,不阻塞,且返回 -1。总结成一句话就是,内核通知我们套接字有数据可以读了,使用 read 函数不会阻塞。

    5700

    python socket编程

    socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),基本上Socket 是任何一种计算机网络通讯中最基础的内容。...error的值 公共 Socket 函数 s.recv(bufsize[, flag]):接受TCP套接字的数据,数据以字符串形式返回,buffsize指定要接受的最大数据量,flag提供有关消息的其他信息...,通常可以忽略  s.send(string[, flag]):发送TCP数据,将字符串中的数据发送到链接的套接字,返回值是要发送的字节数量,该数量可能小于string的字节大小 s.sendall(string...[, flag]):完整发送TCP数据,将字符串中的数据发送到链接的套接字,但在返回之前尝试发送所有数据。...成功返回None,失败则抛出异常 s.recvfrom(bufsize[, flag]):接受UDP套接字的数据u,与recv()类似,但返回值是tuple(data, address)。

    1.2K111

    UNPv1第十三章:高级IO

    read或write调用上阻塞 使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项 前两种技术可以用于任何描述字,而第三种只能用于套接口描述字。...2.recv和send函数 这两个函数和标准的read和write函数都类似,不过多了一个附加参数 #include sszie_t recv(int sockfd, void...size_t iov_len; /* size of buffer */ } readv和writev函数可以用于任何描述字,不仅限于套接口描述字,而且writev是一个原子操作。...有三种方法: 如果在没有数据可读时还有其他事情要做,为了不阻塞在内核中,可以使用非阻塞I/O 如果想检查一下数据而使数据仍留在接收队列中,可以使用MSG_PEEK标志。...不缓冲意味着每次调用标准I/O输出函数时都进行I/O 大多数Unix中标准I/O库的实现遵循了以下规则: 标准错误输出总是不缓冲。 标准输入和标准输出是全缓冲的。

    82030

    c socket

    在TCP/IP协议簇中,使用UDP协议来实现数据报套接字。 1.3原始套接字 该套接字允许对较低层协议(如IP或ICMP)进行直接访问。 2....基本操作函数 >* **创建套接字 socket()** socket()函数调用的格式: `socket(int af,int type,int protocol);` 参数**af**指定套接字使用的协议族...参数protocol说明该套接字使用的协议族中的特定协议。如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。...bind():绑定本地地址 一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联 connect():将套接字连接到目的地址 初始创建的套接字并未与任何外地目的地址关联。...listen()就是把一个套接字设置为这种状态的函数。

    64430

    linux recv返回值,recv recvfrom

    char FAR*, int, int, struct sockaddr FAR*, int FAR* ); 其实要是看看windows中SOCKET的定义,就知道它们几乎是完全相同了,为什么是几乎?...定义,它的值也是-1; 关于这里的“套接字关闭”需要注意,2个函数在用在流式套接字和数据报套接字时,套接字表示的含义不一样,前者表示客户端套接字,而后者表示的是自己的套接字。...如果套接字为阻塞的,在系统缓冲中没有数据的情况下,都将阻塞;如果套接字为非阻塞的,在系统缓冲中没有数据的情况下,都将立即返回,返回值在linux 下为-1, errno被设置为EWOULDBLOCK,在...,拷贝的最大的长度为调用函数时传入的缓冲区的长度,注意这里的长度不一定等于实际缓冲区的长度,可以小于缓冲区的长度,但是绝对不能大于,为什么不能大于,也许你比我更清楚。...如果内核缓冲区有1500个字节,那么 szRecvBuf将被填充256个字节,返回值就是256. 如 果是数据报套接字,在内核缓冲区中的数据小于要求长度(这里是256)的情况下,和流式套接字结果一样。

    2.9K20

    Python的socket编程,有兴趣了解一下?

    s.connect_ex() # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 公用函数 sk.recv() # 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量...flag提供有关消息的其他信息,通常可以忽略。 sk.send() # 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。...sk.recvform() # 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。...非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。

    85910

    socket阻塞与非阻塞,同步与异步IO模型

    例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。...在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。      ...图所示,一个非阻塞模式套接字多次调用recv()函数的过程。前三次调用recv()函数时,内核数据还没有准备好。因此,该函数立即返回WSAEWOULDBLOCK错误代码。...第四次调用recv()函数时,数据已经准备好,被复制到应用程序的缓冲区中,recv()函数返回成功指示,应用程序开始处理数据。 ?      ...当调用该函数时,套接字会自动地设置为非阻塞方式。   由于使用非阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    3.4K10

    Python3 网络编程

    ---- socket()函数 Python 中,我们用 socket() 函数来创建套接字,语法格式如下: socket.socket([family[, type[, proto]]]) 参数 family...: 套接字家族可以是 AF_UNIX 或者 AF_INET type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM protocol: 一般不填默认为0....s.connect_ex()connect()函数的扩展版本,出错时返回出错码,而不是抛出异常公共用途的套接字函数s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量...flag提供有关消息的其他信息,通常可以忽略。s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。...将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。

    91080
    领券