我一直在收到这个错误,我相信我已经把我的问题缩小到了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'类型的操作数
答案 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...
}
}
//...
//...