×

完成端口

服务器用 UDP 完成端口,当客户端(非正常)断开网络连接,返回 1234 错误,之后就不能收到客户端数据?已经完成端口映射现在外网连什么IP可以连接到我电脑

admin admin 发表于2024-06-13 16:35:17 浏览20 评论0

抢沙发发表评论

大家好,如果您还对完成端口不太了解,没有关系,今天就由本站为大家分享完成端口的知识,包括服务器用 UDP 完成端口,当客户端(非正常)断开网络连接,返回 1234 错误,之后就不能收到客户端数据的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

本文目录

服务器用 UDP 完成端口,当客户端(非正常)断开网络连接,返回 1234 错误,之后就不能收到客户端数据

  • UDP是无连接的,断开应该对服务器没有影响吧

  • 你请电脑专家吧

  • 我不知道你请电脑专家吧

已经完成端口映射现在外网连什么IP可以连接到我电脑

WINDOWS自身拨号上网,电脑直接面对因特网的就是外网.通过路由器上网,由网关面对因特网的就是内网,局域网内都是内网.设置端口映射要看路由器具体型号.以我的科磊2005DR为例.在IE地址栏输入192.168.1.1,进入路由器WEB管理界面,点左边导航栏的NAT,填写你的内网IP(如192.168.1.100可以用IPCONFIG命令查到),端口类型(TCP/UDP),及端口号(内外都填一样的即可),确定即可.如果你的路由器有DMZ功能,则直接把你的IP设为DMZ主机即可.我的路由器DMZ也在NAT导航栏里,在DMZ项里填写本机内网IP,确定即可.打不开,你在开始,运行,cmd,输入ipconfig/all看看,记住里面的本地连接的默认gateway.一般路由器的WEB设置同网关地址一样的.用这个地址代替192.168.1.1试试.

IO完成端口 怎么用WSASend一次发送多个数据包

一个socket与完成端口绑定,然后即调用了 WSARecv 又调用了 WSASend 那么WSASend的参数怎么绑定给GetQueuedCompletionStatus ?WSARecv 绑定时是用了CreateIoCompletionPort((HANDLE)hSocket, m_hIOCP, (ULONG_PTR)pIoRecvContent, 0) 第三个参数绑定了iocontent ,send代码如下,这个代码是没有问题的GetQueuedCompletionStatus 能收到它的iocontent ,可是我没看见绑定iocontent 的语句啊,谁能回答一下?try{DWORD sendlen=0;for( DWORD _start=0; _start《buflen; _start+=sendlen ){if( buflen-_start 《 SENDBUFLEN ) sendlen = buflen-_start;else sendlen = SENDBUFLEN;DWORD i, ok_count;IOCONTENT * iocontent;SENDBUF * sendbuf;DWORD numbytes;sendbuf=AllocSendBuf();if(NULL==sendbuf) return 0;memcpy(sendbuf-》buf, buf+_start, sendlen);sendbuf-》count = (LONG)(count+1);for(i=0, ok_count=0; i《count; i++){iocontent = AllocIOContent();if(iocontent){ZeroMemory(&iocontent-》overlapped, sizeof(iocontent-》overlapped));if( bcolse && i 》= count -1 )iocontent-》state =eIoBeconSendClose;elseiocontent-》state =eIoBeconSend;iocontent-》sendbuf =sendbuf;iocontent-》wsabuf.buf = (char *)sendbuf-》buf;iocontent-》wsabuf.len = sendlen;numbytes = 0;iocontent-》sock = socks;if( (WSASend(socks, &iocontent-》wsabuf, 1, &numbytes, 0, &iocontent-》overlapped, NULL)!=SOCKET_ERROR)||(ERROR_IO_PENDING==WSAGetLastError()) ){ok_count++;m_sendBufLenArray.Lock();int sockind = m_sendBufLenArray.FindNode(socks);if(-1==sockind) {sockind = m_sendBufLenArray.NewNode(socks,TRUE);*(m_sendBufLenArray) = 0;}if(-1!=sockind){(*m_sendBufLenArray) ++;}m_sendBufLenArray.Unlock();continue;}FreeIOContent(iocontent);}InterlockedDecrement(&sendbuf-》count);}if(InterlockedDecrement(&sendbuf-》count)==0){FreeSendBuf(sendbuf);}}//关闭if( bcolse ){for ( DWORD i = 0; i 《count; i++){linger m_sLinger;m_sLinger.l_onoff=1;m_sLinger.l_linger=5;setsockopt(socks,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));closesocket(socks);}}return 1;//ok_count;}catch(...){return 0;}return 0;

完成端口投递WSARecv时返回10014,求助

在这里WSARecv和WSASend的调用是立即返回的,但是这2个函数调用成功并不意味着I/O操作完成。 需要调用GetQueuedCompletionStatus来等待I/O操作结果,GetQueuedCompletionStatus会一直阻塞直到I/O操作成功或失败。

怎么知道 完成端口绑定 多少套接字

一个套接字不就对应1个端口么比如192.168.0.2:80就是192.168.0.2的80端口 怎么再绑定其他的呢

完成端口怎么优雅地关闭socket

把 shutdown 换成 CancelIo((HANDLE)m_socket) 试试

在完成端口的设置上PostQueuedCompletionStatus()到底有什么用

完成端口有GetQueuedCompletionStatus函数来取,当然要有函数来放了,不知道为什么没有用Put而是Post

请教GetQueuedCompletionStatus函数如何通知完成端口管理新线程

GetQueuedCompletionStatus函数有个OVERLAPPED结构,很多资料上都采用不同的结构体来扩展该结构,比如有的资料定义:typedef struct _OVERLAPPEDPLUS{OVERLAPPED ol;SOCKET s, sclient;int OpCode;WSABUF wbuf;DWORD dwBytes, dwFlags;}OVERLAPPEDPLUS;然后,当GetQueuedCompletionStatus(hIocp, &dwBytesXfered,(PULONG_PTR)&PerHandleKey, &Overlap, INFINITE);函数返回时候,人们常用OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol)得到一些信息。比如此时端口上完成的是什么操作,数据是什么等,还有,系统如何做到自动填充上述的结构的,也就是说,系统怎么知道在Overlap-》OpCode存放的应该是操作类型,如读,写操作,而在Overlap-》wbuf存放的应该是读写数据。Overlap-》OpCode,操作类型是在投递WSASend,WSARecv的时候,由你自己指定填充这个字段。因为是非堵塞的,等于投递到与套接字相关联的完成端口上,系统会把把WSASend对应的缓冲区提交到底层缓冲,也可以把WSARecv投递的缓冲区,用接收到的数据填充,每一个WSASend,WSARecv,都应有新申请一个overlaspped plus结构提交,以存放本次投递的IO操作的相关数据,——单IO操作数据所以工作器线程中,从完成端口队列中get得到一个完成包的时候,可以根据单句柄数据知道在这个完成端口上是哪一个套接字投递的IO操作完成了,从get到的overlapped中得到相关的已经完成IO数据和信息,并作相应的处理。比如投递了1M,完成包却告知只完成512K,那么你就知道要把余下的512K继续投递WSASend,当然上一个WSASend的Overlapped这个时候可以重用到下一个WSASend中,这个是允许的,可以用一个字段存放全部1M,把余下未Send成功512k放到wbuf中,继续投递或者投递WSARecv1M数据,却收到一个512K的完成通知,那么你要继续投递WSARecv,当然前一个WSARecv的overlapped也可以重用,不过需要一些处理,把已经接收到的512K保存到某个字段中,再投递一个512K的请求去接收完成端口内部,对投递的Overlapped的填充,好像只有WSARecv的时候填充WSABUF,其他都是投递IO前,代码中显式填充,并投递的。至于完成了多少个字节,是在lpNumberOfBytes中得到。对GetQueuedCompletionStatus函数解释:实现从指定的IOCP获取CP。当CP队列为空时,对此函数的调用将被阻塞,而不是一直等待I/O的完成。当CP队列不为空时,被阻塞的线程将以后进先出(LIFO)顺序被释放。对于IOCP机制,它允许多线程并发调用GetQueuedCompletionStatus函数,最大并发数是在调用CreateIoCompletionPort函数时指定的,超出最大并发数的调用线程,将被阻塞。函数解释如下: 声明: BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, LPDWORD lpNumberOfBytes, PULONG_PTR lpCompletionKey, LPOVERLAPPED *lpOverlapped, DWORD dwMilliseconds); 调用参数: CompletionPort:指定的IOCP,该值由CreateIoCompletionPort函数创建。 lpnumberofbytes:一次完成后的I/O操作所传送数据的字节数。 lpcompletionkey:当文件I/O操作完成后,用于存放与之关联的CK。 lpoverlapped:为调用IOCP机制所引用的OVERLAPPED结构。 dwmilliseconds:用于指定调用者等待CP的时间。 返回值: 调用成功,则返回非零数值,相关数据存于lpNumberOfBytes、lpCompletionKey、lpCompletionKey变量中。失败则返回零值。

完成端口 为什么正常closesocket还是服务器还是会出现异常退出

你好。和超时没关系,一般SOCKET在调用recv函数时如果有数据时才返回,如果没有数据时就在recv函数等待直至有数据或SOCKET关闭或网络异常,如果是SOCKET被关闭时,recv返回0,异常时返回-1,用GetLastError可以察看具体的错误。(只在socket为同步方式有效)如果我的回答没能帮助您,请继续追问。

关于完成端口到此分享完毕,希望能帮助到您。