首页
社区
课程
招聘
[求助][求助]LSP中重写WSPConnect,用udp,sendto成功,select成功,recvfrom返回 -1,错误码10054.有遇到过的吗?
发表于: 2014-6-29 11:51 8251

[求助][求助]LSP中重写WSPConnect,用udp,sendto成功,select成功,recvfrom返回 -1,错误码10054.有遇到过的吗?

2014-6-29 11:51
8251
LSP中重写WSPConnect,用udp,sendto成功,select成功,recvfrom返回 -1,错误码10054.有遇到过的吗?相同的代码在EXE中没有任何问题。伪代码如下
iLen = sendto(s, buffer, 16 0, (sockaddr*)&server, iLen);
                int error = WSAGetLastError();
                if ( SOCKET_ERROR == iLen )
                {
                        break;
                }
               
               
                int nsel = select(0, &wfds, NULL, NULL, &tv);
                if ( 0 >= nsel )
                {
                        。。。
                }

                if(FD_ISSET(s,&wfds))
                {
                        memset(buffer, 0, sizeof buffer);
                        int len = sizeof sockaddr;
                        iLen = recvfrom(s, buffer, sizeof buffer, 0, NULL, NULL );
。。。
                 }

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
网上资料说10054是微软的bug,可用如下方法解决:
DWORD dwBytesReturned = 0;
                BOOL bNewBehavior = FALSE;
                DWORD status;

#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)

                status = WSAIoctl(s, SIO_UDP_CONNRESET,
                        &bNewBehavior, sizeof(bNewBehavior),
                        NULL, 0, &dwBytesReturned,
                        NULL, NULL);

                if (SOCKET_ERROR == status)
                {
                        DWORD dwErr = WSAGetLastError();
                        if (WSAEWOULDBLOCK == dwErr)
                        {
                                // nothing to do
                                return(FALSE);
                        }
                        else
                        {
                                printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d/n", dwErr);
                                return(FALSE);
                        }
                }
但是还是不行,问题依然存在
2014-6-29 11:54
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
哪里有这么简单。。。
你要知道,socket的类型是有很多种的。比如说,传递进来的那个socket,可能是异步的(比如说消息SOCKET、或事件SOCKET、或完成端口)。
除非这个SOCKET是你自己创建的。
2014-7-1 12:35
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
比如说,对方的socket是个消息socket,那么你要实现重定向(比如说,重定向到一个http代理),那么你除了处理wspconnect外,还需要处理WSPASyncSelect。当对方注册FD_CONNECT到窗口的时候,你在这里把窗口句柄保存起来,同时不要调用下一层的WSPASyncSelect。当你在WSPConnect处理完重定向(比如说,连接到你的HTTP代理,发送原来对方需要连接的IP,等待回应),再发送FD_CONNECT消息给那个原来你保存的窗口。

其它Select模型,事件模型、IOCP模型之类的处理方法类似。
2014-7-1 16:36
0
游客
登录 | 注册 方可回帖
返回
//