传递给套接字侦听器的无效参数

时间:2013-04-23 13:02:04

标签: c# sockets

我一直在收到这个错误,我相信我已经把我的问题缩小到了64位机器上的using a 32-bit监听器。有没有办法让它在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);

我尝试按照此relevant问题中的代码进行操作,但它给了我错误:

  

运算符'=='不能应用于'System.Net.Sockets.AddressFamily'和'string'类型的操作数

3 个答案:

答案 0 :(得分:3)

我认为你错过了Socket Binding,在一个端口的插座可以Listen之前。

根据MSDN:

  

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

     

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

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

P.S。 :始终使用大于4000的值作为侦听端口!

答案 1 :(得分:0)

您是否按the documentation中讨论的那样检查了MaxConnections属性?

该文档还介绍了如何检查ErrorCode以获取更多详细信息。也许你应该探索这个选择。

答案 2 :(得分: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...
    }
}
//...
//...