在服务器上挂接WSASend/ wssarecv时,套接字无效

Socket is invalid while hooking WSASend/WSARecv on the server

本文关键字:wssarecv 套接字 无效 WSASend 服务器      更新时间:2023-10-16

我在c++中使用与我用来钩住客户端的WSASend和WSARecv函数相同的方法钩住WSASend和WSARecv。在客户端,我能够从WSASend/WSARecv传递的Socket结构中获得IP,端口和套接字;然而,对于服务器,当我尝试使用getpeername或getsockname()时,它们都返回错误10057(套接字未连接)…

我很确定钩子在服务器上是正确的,因为它成功地打印了字节,我也确定套接字应该是有效的,看看客户端和服务器如何建立成功的连接。

有没有其他方法可以解决这个问题?我一直在网上寻找解决方案,但我没有看到任何人有同样的问题。

我试过了:

            sockaddr *address = new sockaddr;
            int peer_len;
            getpeername(s, address, &peer_len);
            int err = WSAGetLastError();
            if(err==0)
            {
                char *Str = inet_ntoa(((sockaddr_in*)address)->sin_addr);
                printf("[%s", Str);
                printf(":%d]",ntohs(((sockaddr_in*)address)->sin_port));
            }
            else
            {
                printf("Error %in",err);
            }

(同时使用getpeername和getsockname)两者都会导致相同的套接字未连接错误。

我计划使用c++ dll获得的数据包并将信息转发到c# dll,因为它更容易管理(对我来说无论如何),但我需要区分每个数据包与它的套接字id。

您只能在连接的套接字上执行此操作,即从accept()调用返回的套接字,而不能在侦听的"服务器"套接字上执行此操作。