2

我一直在收到这个错误,我相信我将问题缩小到我在 64 位机器上使用 32 位侦听器。有没有办法让它在 64 位系统上运行?

18      Socket sListener;
...
34          permission = new SocketPermission(NetworkAccess.Accept, TransportType.Tcp, "", SocketPermission.AllPorts);

36          //Listening Socket object
37          sListener = null;

39          //Ensure the code has permission to access the Socket
40          permission.Demand();

42          IPHostEntry ipHost = Dns.GetHostEntry("");
43          IPAddress ipAddress = ipHost.AddressList[2];
44          ipEndPoint = new IPEndPoint(ipAddress, 4510);

46          sListener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
...
71      sListener.Listen(10);
72
73      //Begins an asynchronous operation to accept an attempt
74      AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
75      sListener.BeginAccept(aCallback, sListener);

我试图遵循这个相关问题中的代码,但它给了我错误:

运算符“==”不能应用于“System.Net.Sockets.AddressFamily”和“字符串”类型的操作数

4

3 回答 3

3

我认为您在 Socket 可以侦听端口之前缺少Socket Binding 。

根据 MSDN:

如果您需要使用特定的本地端点,请使用 Bind 方法。您必须先调用 Bind,然后才能调用 Listen 方法。除非您需要使用特定的本地端点,否则您无需在使用 Connect 方法之前调用 Bind。您可以在无连接和面向连接的协议上使用 Bind 方法。

在调用 Bind 之前,您必须首先创建要从中通信数据的本地 IPEndPoint。如果您不关心分配哪个本地地址,您可以使用 IPAddress.Any 作为地址参数创建一个 IPEndPoint,底层服务提供商将分配最合适的网络地址。如果您有多个网络接口,这可能有助于简化您的应用程序。如果您不关心使用哪个本地端口,您可以使用 0 作为端口号创建一个 IPEndPoint。在这种情况下,服务提供商将分配一个介于 1024 和 5000 之间的可用端口号。

70:    sListen.Bind(your IP end point)
71:    sListener.Listen(10);

PS:监听端口总是使用大于 4000 的值!

于 2013-04-23T13:09:50.560 回答
0

也许以下示例也会对您有所帮助。

Socket clientSocket;
System.Net.IPEndPoint clientEndPoint;
System.Net.Sockets.NetworkStream networkStream;
IAsyncResult beginAcceptAsyncResult;
System.Threading.WaitHandle []waitHandleArray;
int waitHandleSignalled;

System.Net.IPEndPoint listenEndpoint = new System.Net.IPEndPoint("127.0.0.1", 45000); //make sure port is free (check with cmd: netstat -an)
System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(listenEndpoint);

waitHandleArray = new System.Threading.WaitHandle[1];

listener.Start();

do
{
    try
    beginAcceptAsyncResult = listener.BeginAcceptSocket(null, null);
    waitHandleArray[0] = beginAcceptAsyncResult.AsyncWaitHandle;
    waitHandleSignalled = System.Threading.WaitHandle.WaitAny(waitHandleArray);

    if (waitHandleSignalled != 0)
    {
        clientSocket = _TCPListener.EndAcceptSocket(BeginAcceptAsyncResult);

        clientEndPoint = clientSocket.RemoteEndPoint as System.Net.IPEndPoint;

        networkStream = new System.Net.Sockets.NetworkStream(clientSocket, true);

        //do more with NetworkStream...
    }
}
//...
//...
于 2013-04-23T13:28:10.343 回答
0

您是否按照文档MaxConnections中的说明检查了该属性?

该文档还描述了如何查看ErrorCode更多详细信息。也许您应该探索该选项。

于 2013-04-23T13:09:38.343 回答