accept函数返回值(accept函数python)
这篇文章给大家聊聊关于accept函数返回值,以及accept函数python对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
WSAEventSelect()的返回值:
如果应用程序指定的网络事件及其相应的事件对象成功设置,则返回0。否则的话,将返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
在使用select()和WSAAsyncSelect()函数时,WSAEventSelect()常用来决定何时进行数据传送操作(如send()或recv()),并期望能立即成功。但是一个稳定的应用程序应该做好这样的准备,即事件对象被设置,并且一个WinSock调用以WSAEWOULDBLOCK立即返回。举例来说,有可能发生下述操作序列:
(i)套接口s上到达数据;WinSock设置了WSAEventSelect事件对象。
(ii)应用程序进行其他操作。
(iii)在进行操作时,应用程序调用了ioctlsocket(s, FIONREAD...)并发现有数据可读。
(iv)应用程序调用一个recv(s,...)来读取数据。
(v)最后应用程序等待WSAEventSelect()所指定的数据对象,该数据对象指出数据可读。
(vi)应用程序调用recv(s,...),但以WSAEWOULDBLOCK错误失败。
其他的操作序列也是可能的。
成功地记录了网络事件的发生(通过设置内部网络事件记录的相应位),并且将相应的事件对象设置了信号后,不会对该网络事件作进一步的操作,直到应用程序调用了相应的函数显式地重新允许该网络事件及相应事件对象的信号。
网络事件重新允许函数
FD_READ recv()或 recvfrom()
FD_WRITE send()或 sendto()
FD_OOB recv()
FD_ACCEPT accept()或WSAAccept(),直到返回的错误代码为 WSATRY_AGAIN,指明条件函数返回CF_DEFER。
FD_CONNECT NONE
FD_CLOSE NONE
FD_QOS用SIO_GET_QOS命令调用WSAIoctl()。
FD_GROUP_QOS用SIO_GET_GROUP_QOS命令调用WSAIoctl()。
错误代码:
WSANOTINITIALISED在调用本API之前应成功调用WSAStartup()。
WSAENETDOWN网络子系统失效。
WSAEINVAL参数中有非法值,或者指定的套接口处于非法状态。
WSAEINPROGRESS一个阻塞的WinSock调用正在进行中,或者服务提供者仍在处理一个回调函数
WSAENOTSOCK描述字不是一个套接口。
另请参阅:WSACloseEvent(),WSACreateEvent(),WSAEnumNetworkEvents(),WSAGetOverlappedResult(),WSAWaitForMultipleEvents().
WSAAccept()的附录
这个WSAAccept函数提取第一个连接在队列中等待将要连接的socket,并检查它的条件函数,提供了指定条件函数(即非NULL)。如果条件函数返回CF_ACCEPT,WSAAccept创建一个新的套接字和执行任何套接字分组所显示的结果参数g在条件函数中。新创建的套接字具有socket相同的属性包括异步事件注册WSAAsyncSelect或WSAEventSelect,但不包括监听套接字的组ID。如果条件函数返回CF_REJECT,WSAAccept拒绝连接请求。条件函数运行在相同的线程作为该函数的功能,应尽快返回。条件函数应该返回 CF_DEFER表明没有作出决定,没有行动关于这个服务提供者连接请求。当应用程序准备采取行动在连接请求时,它将并返回再次调用WSAAccept CF_ACCEPT或者 CF_REJECT作为条件函数的返回值。
一个套接字在默认模式(阻塞)会阻塞,直到连接存在,当一个应用程序调用WSAAccept和没有连接上pendng队列
一个套接字的非阻塞模式(阻塞)失败与错误WSAEWOULDBLOCK当一个应用程序调用WSAAccept和没有连接上pendng队列。WSAAccept后成功,并返回一个新的套接字处理,接受插座不能用于接受任何更多的连接。原始套接字保持开放和监听新的连接请求。
参数是一个结果的addr的参数填写的地址连接实体,作为已知的通信层。的确切格式addr参数是由家庭地址的通信发生。这个addrlen是一个值的结果参数;它应该最初包含空格的数量由addr指出。在返回时,它将包含实际的长度(字节)的地址返回。这个调用是使用面向连接的套接字类型如袜子流。如果addr和/或addrlen等于零,那么任何关于远程地址返回接受套接字。否则,这两个参数将被填满,不管条件函数指定或返回内容。
A prototype of the condition function is as follows:
int CALLBACK ConditionFunc( IN LPWSABUF lpCallerId, IN LPWSABUF lpCallerData, IN OUT LPQOS lpSQOS, IN OUT LPQOSlpGQOS, IN LPWSABUF lpCalleeId, OUT LPWSABUF lpCalleeData, OUT GROUP FAR* g, IN DWORD dwCallbackData);
ConditionFunc是应用程序提供的回调函数的占位符。函数必须位于一个DLL或应用程序模块的实际情况。它是在模块定义文件中导出。 UseMakeProcInstance一个过程实例的回调函数的地址。lpCallerId参数是一个值,该值的参数,该参数包含连接实体的地址。的lpCallerData是一个数值参数,包含任何用户数据。这些参数中的信息一起被发送的连接请求。如果无来电显示识别主叫方数据是可用的,相应的参数为NULL。许多网络协议不支持连接时的主叫方数据。大多数传统的网络协议可以预计到支持主叫方ID信息,在连接请求的时间。 lpCallerId点的buf所指向的WSABUF部分一个SOCKADDR。根据它的地址族(通常由铸造的的SOCKADDR一些类型特定的地址族)的的SOCKADDR的解释。lpSQOS参数的引用FLOWSPEC的结构为插座指定的来电,为每个方向之一,任何额外的供应商特定的参数。适用于任何单向插座的发送或接收流规范值将被忽略。一个NULL值表明,有没有调用者提供QOS和,没有谈判是可能的。一个非NULL lpSQOS的指针指示的QoS协商是发生或供应商没有谈判,准备接受QOS要求。lpGQOS参数(保留以供将来使用插座组)引用的FLOWSPEC的结构套接字组的调用者创建,为每个方向之一,任何额外的供应商特定的参数。 lpGQOS一个NULL值表示无来电显示提供的服务质量。如果协商是发生的服务质量信息可以被返回。lpCalleeId是一个值参数,包含本地地址,所连接的实体。 lpCalleeId点的buf所指向的WSABUF部分一个SOCKADDR。根据它的地址族(通常由铸造的的SOCKADDR一些类型特定的地址族)的的SOCKADDR被解释。lpCalleeData是一个结果参数,用于为所使用的条件的函数来提供用户数据返回到连接的实体。最初的lpCalleeData-> len个包含由服务提供商分配的缓冲区,并指出,通过lpCalleeData->缓冲区的长度。通过用户数据返回给调用者的值为零,则表示不支持。条件函数复制到lpCalleeData-> len个字节的数据到lpCalleeData->缓冲区,然后更新lpCalleeData-> len个显示实际传输的字节数。如果没有用户数据将被传递回给调用者,条件函数应设置lpCalleeData的-> len个零。所有的地址和用户数据的格式的特定套接字所属的地址族。保留供未来使用插座组:分配的结果参数g在条件函数来表示以下操作:1、若果&g是一个现有的插座组ID,加s到该组,本组所设定的所有要求得到满足;2、如果&g= SG_UNCONSTRAINED_GROUP的,创建一个无约束的插座组,有S的第一个成员;3、如果&g= SG_CONSTRAINED_GROUP的,创建一个受限的插座组,有S的第一个成员;4、如果&g=零,没有组进行操作。对于无约束的群体,任何一组插槽可以组合在一起,只要他们支持由一个单一的服务提供商。可以由一个有限的插座组仅面向连接的套接字,并要求所有组合插座上的连接到相同的地址在同一主机上。对于新创建的套接字组,新的组ID可以检索利用getsockopt选项SO_GROUP_ID,如果此操作成功完成。一个插座组及其相关联的ID仍然有效,直到最后一个套接字被关闭属于该插座组。插座组ID是唯一的,对于一个给定的服务供应商的所有进程。dwCallbackData参数值传递的条件功能的dwCallbackData在原来的WSAAccept调用的参数传递的值。这个值被解释只能由Windows套接字第2版客户端。这允许客户端通过一些WSAAccept调用网站的条件函数的上下文信息。这也提供了与任何所需的附加信息,以确定是否接受的连接或没有的功能的条件。一个典型的用法是通过适当投指针的数据结构,它包含与此套接字关联的应用程序定义的对象的引用。
异步socket是什么意思
异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。
由于socket函数在accept、send的时候,由于网络等原因,不能很快的完成,因此会发生进程阻塞(直到socket函数执行完成,下面的函数才会执行),因此,往往是新建一个进程,让他执行socket过程,主线程管理用户界面,不会出现UI假死的情况。因此,所谓异步的socket,就是在另外一个进程中实现的。
accept函数返回值和accept函数python的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!