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

recvfrom()在线程中使用原始套接字时返回-1?

在使用原始套接字时,recvfrom()函数在线程中返回-1的原因可能有以下几点:

  1. 权限问题:在线程中使用原始套接字时,可能会涉及到对网络底层的操作,需要具备足够的权限才能执行。如果当前线程没有足够的权限,调用recvfrom()函数时可能会返回-1。
  2. 网络资源竞争:在线程中使用原始套接字时,可能会与其他线程或进程竞争网络资源。如果多个线程同时调用recvfrom()函数,可能会导致资源竞争,其中一个线程可能会返回-1。
  3. 套接字状态问题:在线程中使用原始套接字时,如果套接字的状态不正确,调用recvfrom()函数可能会返回-1。例如,套接字未正确初始化、已关闭或已经被其他线程关闭等情况。
  4. 网络异常问题:在线程中使用原始套接字时,可能会遇到网络异常,例如网络连接断开、超时等。这些异常情况可能导致recvfrom()函数返回-1。

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

  1. 确保线程具备足够的权限:在使用原始套接字的线程中,确保线程具备足够的权限来执行网络底层操作。可以通过提升线程权限或者在程序运行时以管理员身份运行来解决权限问题。
  2. 合理管理网络资源:在多线程环境下使用原始套接字时,需要合理管理网络资源,避免资源竞争。可以使用互斥锁或其他同步机制来保证线程之间的互斥访问。
  3. 检查套接字状态:在使用原始套接字之前,确保套接字的状态正确。可以在调用recvfrom()函数之前检查套接字的状态,确保套接字已正确初始化并且处于可用状态。
  4. 处理网络异常:在使用原始套接字时,需要处理可能出现的网络异常情况。可以通过捕获异常、设置超时时间或者使用心跳机制来处理网络异常,避免recvfrom()函数返回-1。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

系统五种IO模型【原理笔记】

备注:调用recvfrom没有数据返回,因此内核转而立即返回一个EWOULDBLOCK错误;数据准备好被复制到应用进程缓存区,于是recvfrom成功返回。...图示应用进程阻塞于select调用,等待数据报套接变为可读,当select返回套接可读这一条件,调用recvfrom把所读数据复制到应用进程缓冲区。...与I/O复用密切相关的另一种I/O模型:线程使用使用阻塞I/O;该模式没有使用select阻塞在多个文件描述符上,而是使用线程,每个文件描述符一个线程,这样每个线程都可以自由地调用像recvfrom...备注:应用程序开启套接的信号驱动式I/O功能,通过sigaction系统调用安装一个信号处理函数。系统调用立即返回,应用程序继续工作,即:非阻塞。...进而可以调用recvfrom读取数据报。特点:内核描述符就绪发送SIGIO信号通知应用程序,等待数据报的过程不被阻塞;即:图示第1步不被阻塞。 五、异步I/O模型 ?

1.1K10

网络 IO 模型:同步异步,傻傻分不清楚?

以 UDP 数据报套接为例, 下图是其阻塞 IO 的调用过程: 在上图中, 进程调用 recvfrom, 其系统调用直到数据报返回并且被复制到应用进程的缓冲区 或者发送错误时才返回....因此进程调用 recvfrom 开始到它返回的整段时间内都是被阻塞的。...非阻塞式 IO(Non-Blocking IO) 进程把一个套接设置为非阻塞是通知内核: 当调用线程所请求的 IO 操作需要调用线程休眠来等待操作完成, 此时不要将调用线程休眠, 而是返回一个错误...第四次调用 recvfrom , 已经有数据了, 此时, recvfrom 会阻塞住, 等待内核将数据赋值到应用进程的缓冲区, 然后再返回....当 select 返回套接可读这一条件, 我们就可以调用 recvfrom 把所读取的数据报复制到应用进程缓冲区。

88421

Python3快速入门(十)——Pyth

二、socket模块接口 1、socket类型 Python ,用使用socket函数来创建套接,语法格式如下: sock = socket.socket([family[, type]]) family...参数size指定接收数据的缓冲区的大小,返回接收的数据。 socket.send(buf):发送TCP数据,将buf的数据发送到连接的套接返回要发送的字节数量,可能小于buf的字节大小。...将buf的数据发送到连接的套接,但在返回前会尝试发送所有数据。成功返回None,失败则抛出异常。...data,addr = socket.recvfrom(bufsize):从套接接收数据,但返回(data,address)。data是接收数据的缓冲区,address是发送数据的套接地址。...服务端编程模型如下: 1、调用socket函数创建一个TCP套接返回套接sock。 2、调用bind将sock绑定到已知地址,通常为ip和port。

1.1K20

面向连接的c语言socket 程序流程(TCP)

int bind(        SOCKET s,//标识一个未绑定的套接描述符 ,它是socket()函数调用成功返回的值         const struct sockaddr FAR*...Addr参数的实际格式由套接口创建所产生的地址族确定。 addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。...八.无连接的套接上接收数据——recvfrom() 本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。...一个套接不再使用时一定要关闭这个套接,以释放与该套接关联的所有资源,包括等候处理的数据 int PASCAL FAR closesocket( SOCKET s); s:被关闭的套接口的描述。...一个多线程的环境下,WSACleanup()中止了Windows Sockets在所有线程上的操作.

1.3K20

Netty 之 Java 的 IO 演进之路

UNIX提供了5种I/O模型: 阻塞I/O模型:进程调用recvfrom,系统直到数据包到达且被复制到应用进程的缓冲区或发生错误才返回,在此期间一直会阻塞等待。...进程调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以被称为阻塞I/O模型。...非阻塞I/O模型:recvfrom从应用层到内核,如果该缓冲区没有数据,直接返回错误,一般对非阻塞I/O模型进行轮询状态检查,看内核是否有数据到来。...I/O 多路复用技术 作用 I/O编程过程,当需要同时处理多个客户端接入请求,有两种处理方式: 多线程 I/O多路复用技术 那么I/O多路复用技术有什么好处呢?...应用场景 服务器需要同时处理多个处于监听状态或连接状态的套接; 服务器需要同时处理多种网络协议的套接。 支持 I/O 多路复用的模型有哪些?

45630

高性能网络编程 - 解读5种IO模型

具体来说,recvfrom 通常用于接收来自网络的数据报,例如从套接(socket)接收数据。...当应用程序调用 recvfrom ,如果没有数据报可用,它会等待直到有数据报到达,然后将数据报的内容复制到应用程序指定的缓冲区,并返回成功。...对于一个套接上的输入操作, 第一步通常涉及等待数据从网络到达。当所等待分组到达,它被复制到内核的某个缓冲区。 第二步就是把数据从内核缓冲区复制到应用进程缓冲区。...缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大为了维护程序,内存、线程切换开销较大,这种模型实际生产中很少使用。...信号驱动 I/O 尽管对于处理 UDP 套接来说有用,即这种信号通知意味着到达一个数据报,或者返回一个异步错误。

21130

Java流

对于 NIO 来说,我们的业务线程 IO 操作准备好,得到通知,接着就由这个线程自行进行 IO 操作,IO 操作本身是同步的。 阻塞式I/O模型:默认情况下,所有套接都是阻塞的。怎么理解?...先理解这么个流程,一个输入操作通常包括两个不同阶段: (1)等待数据准备好; (2)从内核向进程复制数据。 对于一个套接上的输入操作,第一步通常涉及等待数据从网络到达。...当所有等待分组到达,它被复制到内核的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。好,下面我们以阻塞套接recvfrom的的调用图来说明阻塞。...非阻塞式I/O:以下这句话很重要:进程把一个套接设置成非阻塞是通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把进程投入睡眠,而是返回一个错误。...看看非阻塞的套接recvfrom操作如何进行。可以看出recvfrom总是立即返回。 ?

86910

浅谈Linux 网络 IO 模型简介(图文)

1、介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。...比如I/O模型下的套接接口:进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区或者发生错误时才返回,在此期间一直等待。...进程调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以叫阻塞I/O模型。 图示: ?...2、I/O多路复用技术 I/O编程,需要处理多个客户端接入请求,可以利用多线程或者I/O多路复用技术进行处理。...主要的应用场景: 服务器需要同时处理多个处于监听状态或多个连接状态的套接。 服务器需要同时处理多种网络协议的套接

90131

怎样理解阻塞非阻塞与同步异步的区别?

先理解这么个流程,一个输入操作通常包括两个不同阶段: (1)等待数据准备好; (2)从内核向进程复制数据。 对于一个套接上的输入操作,第一步通常涉及等待数据从网络到达。...当所有等待分组到达,它被复制到内核的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。...好,下面我们以阻塞套接recvfrom的的调用图来说明阻塞 标红的这部分过程就是阻塞,直到阻塞结束recvfrom才能返回。...非阻塞式I/O: 以下这句话很重要:进程把一个套接设置成非阻塞是通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把进程投入睡眠,而是返回一个错误。...看看非阻塞的套接recvfrom操作如何进行 可以看出recvfrom总是立即返回

38620

Linux C Socket Api详解

与应用程序使用文件描述符一样,访问套接需要使用套接描述符。套接描述符UNIX系统是用文件描述符实现的。...当对同一域和套接类型支持多个协议,可以使用proticol参数选择一个特定协议。...2.1 字节序 同一台计算机上进程间通信,一般无需考虑字节序。 TCP/IP协议栈使用大端字节序。有关字节序大家可自行百度。 Linux系统是小端字节序。...这个新的套接描述符和原始套接(sockfd)具有相同的套接类型和地址族。传给accept的原始套接没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。...出错返回-1 因为可以获得发送者的地址,recvfrom通常用于无连接套接

5.5K10

了解一波经典的 IO 模型

1、首先应用进程发起 I/O 系统调用后,应用进程阻塞,转到内核空间处理。 2、之后,内核开始等待数据,等待数据到达之后,将内核的数据拷贝到用户的缓冲区,整个 I/O 处理完毕后返回进程。...上图的阻塞式 I/O 模型表示的是一对一沟通的情形,使用线程/进程 + 阻塞式 I/O 我们可以管理多个 Socket ,实现一对多服务。...非阻塞式 I/O 模型 类 Unix 系统下,可以把一个 Socket 设置成非阻塞的。这意味着内核在数据报没有准备好不会阻塞应用进程(睡眠态),而是返回一个错误。 ?...进程阻塞于 select 调用,等待数据报套接变为可读,一但 select 返回套接可读,系统调用 recvfrom 把所读数据报复制到应用进程缓冲区。 问题来了?...对于高并发场景,如果一台机器要维护 1 万个连接(C10K问题),使用线程/进程的方式处理,操作系统是无法承受的。如果维持 1 亿用户在线需要 10 万台服务器,成本那是相当的高。

55220

MFC的UDP编程实现

无论是服务器端还是客户端,其通信过程概括为: 创建套接(socket)–>绑定(bind)–>发送send(或接收recv)–>关闭套接(closesocket) 2、特殊地址: 实际通信网络,...但是一台计算机上,特别用于某些测试用途,这类地址就有用武之地了。...af, int type, int protocol); 返回值说明:成功返回套接,失败返回INVALID_SOCKET; 创建流套接(TCP),如:m_socket = socket(AF_INET...,SOCK_STREAM,0) 创建数据报套接(UDP),如:m_socket = socket(AF_INET,SOCK_DGRAM,0) 成功创建套接之后,需要填充sockaddr_in结构体作为网络函数参数...,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); 4、关键点: (1)UDP实现过程简单,关键是了解每个过程所需要函数及其使用方法 (2)为UDP通信创建线程,是设计更加合理

1.2K10

python socket

1、TCP链接 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。所以进行TCP链接首先要开启服务器端口。...没有数据接收线程在此堵塞 ⑥  sock.send(bytes)     将bytes发送到tcp客户端,返回发送的字节数,接收和发送可以并发执行 ⑦  sock.close()   将与客户端通信的套接关闭...,返回发送的字节数 ④  msg = sk.recv(bufsize)     接收数据,接收和发送可以并发执行 ⑤  sk.close()  关闭套接 1 import socket 2...客户端可不进行绑定程序运行时随机绑定一个端口号 ③  recv_msg, recv_addr = sk.recvfrom(bufsize)   接收数据,没有数据接收线程在此堵塞 ④  sk.sendto...= sk.recvfrom(bufsize)   接收数据,没有数据接收线程在此堵塞 ④  sk.close()  关闭socket 1 import socket 2 3 print("

53520

socket网络编程基础

套接 socket是操作系统内核的一个数据结构,它是网络节点进行相互通信的门户。网络编程实际上也可以称作套接编程。...套接有3种类型: 流式套接,即TCP套接,用SOCK_STREAM表示 数据报套接,即UDP套接(或称无连接套接),用SOCK_DGRAM表示 原始套接,用SOCK_RAM表示 本文主要分析...对比TCP套接通信流程,区别在于: 使用TCP套接必须先建立连接(如客户机进程的connect(),服务器进程的listen()和accept()) 而UDP套接不需要先建立连接,它在调用socket...()生成一个套接字后,服务器端调用bind()绑定一个端口,然后服务器进程挂起于recvfrom()调用,等待并接收网络某一客户机的数据请求。...,server.cpp 没有使用listen()函数,client.cpp 也没有使用connect() 函数,因为 UDP 不需要连接。

94710

Python-socket总结

列入你和移动客服咨询问题,会有一个客服为你解决问题一样,就是你和客服间的相互通信 socket里就是“发送”和“接收”这两个动作就是socket通信方式 socket.gethostname()    ...# 当前套接的地址 s.getsockopt() # 返回指定套接的参数 s.setsockopt()   # 设置指定套接的参数 s.close()        # 关闭套接 s.setblocking...socket.SOCK_STREAM # 流式socket , for TCP socket.SOCK_DGRAM # 数据报式socket , for UDP socket.SOCK_RAW # 原始套接...,普通的套接无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接,可以通过IP_HDRINCL套接选项由用户构造IP...SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用

72420

Linux下突破限制实现高并发量服务器

1、修改用户进程可打开文件数限制 Linux平台上,无论编写客户端程序还是服务端程序,进行高并发TCP连接处理,最高的并发 数 量都要受到系统对用户单一进程同时可打开文件数量的 限制(这是因为系统为每个...高TCP并发的 情形下,如果使用同步I/O,这会严重阻塞程 序的运转,除非为每个TCP连接的I/O创建一个线程。 但是,过多的线程又会因系统对线程的调度造成巨大开销。...(如果系统调用收到一个中断信号,则它的调用会被中断)我们称这个进程调用recvfrom 一直到从 recvfrom 返回这段时间是阻塞的。 当recvfrom正常返回,我们的进程继续它的操作。...当我们调用select 函数阻塞的时候,select 函数等待数据报套接进入读就绪状态。当select 函数 返回的时候,也就是套接可以读取数据的时候。...但是我们的程序阻塞在等待标准输入的数据上,它读取套接字数据之前(也许是很长一段 间),它不会看见结束标志.我们就不能够使用阻 塞模式的套接

4K40

ioctlsocket() 用法 socket recvfrom 阻塞 非阻塞 设置

参考一: Select模型与ioctlsocket的使用方法 int iMode = 1; //0:阻塞 ioctlsocket(socketc,FIONBIO, (u_long FAR*) &...不知道大家有没有遇到过这种情况,当socket进行TCP连接的时候(也就是调用connect),一旦网络不通,或者是ip地址无效,就可能使整个线程阻塞。一般为30秒(我测的是20秒)。...错误代码: WSANOTINITIALISED:使用此API之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。...如果在“紧急”(带外)数据前有常规数据,则按序接收这些数据(请注意,recv()和recvfrom()操作不会 一次调用混淆常规数据与带外数据)。...错误代码:   WSANOTINITIALISED:使用此API之前应首先成功地调用WSAStartup()。

3.5K20

Linux下网络编程-UDP协议探测在线好友

Linux下使用socket创建UDP的套接,属性要选择数据报类型SOCK_DGRAM。 sockfd=socket(AF_INET,SOCK_DGRAM,0); 2....UDP协议发送和接收数据的函数 2.1 recvfrom函数 UDP使用recvfrom()函数接收数据,他类似于标准的read(),但是recvfrom()函数要指明数据的目的地址。...2.2 sendto函数 UDP使用sendto()函数发送数据,他类似于标准的write(),但是sendto()函数要指明目的地址。...尽管不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否普通数据流接收,广播数据是否可以从套接口发送等等。...(sockfd_TCP == -1) { printf("网络套接创建失败\n"); return 0; } /*允许绑定已使用的端口号*/ int on = 1;/*

2.2K30

关于epoll的IO模型是同步异步的一次纠结过程

先理解这么个流程,一个输入操作通常包括两个不同阶段: (1)等待数据准备好; (2)从内核向进程复制数据。 对于一个套接上的输入操作,第一步通常涉及等待数据从网络到达。...好,下面我们以阻塞套接recvfrom的的调用图来说明阻塞 标红的这部分过程就是阻塞,直到阻塞结束recvfrom才能返回。...非阻塞式I/O: 以下这句话很重要:进程把一个套接设置成非阻塞是通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成,不要把进程投入睡眠,而是返回一个错误。...看看非阻塞的套接recvfrom操作如何进行 可以看出recvfrom总是立即返回。...好,下面我用我的语言来总结一下阻塞,非阻塞,同步,异步 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待; 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程还是会阻塞

1K10
领券