2013-04-23 2 views
2

Я получаю эту ошибку непрерывно, и я считаю, что я сузил свою проблему до того, что у меня есть using a 32-bit слушатель на 64-битной машине. Есть ли способ заставить это работать на 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 вопрос, но он дал мне ошибку:

Operator '==' cannot be applied to operands of type 'System.Net.Sockets.AddressFamily' and 'string'

+0

в коде я не нашел что-либо отношение к '' == –

+0

За ошибки в коде вы получили от соответствующего вопроса, AddressFamily этого перечисления. Попробуйте '== AddressFamily.InterNetwork' вместо' == "InterNetwork" ' – Geoff

ответ

3

Я думаю, что вам не хватает Socket Binding, прежде чем Socket может Listen в порту.

В соответствии с MSDN:

Use the Bind method if you need to use a specific local endpoint. You must call Bind before you can call the Listen method. You do not need to call Bind before using the Connect method unless you need to use a specific local endpoint. You can use the Bind method on both connectionless and connection-oriented protocols.

Before calling Bind, you must first create the local IPEndPoint from which you intend to communicate data. If you do not care which local address is assigned, you can create an IPEndPoint using IPAddress.Any as the address parameter, and the underlying service provider will assign the most appropriate network address. This might help simplify your application if you have multiple network interfaces. If you do not care which local port is used, you can create an IPEndPoint using 0 for the port number. In this case, the service provider will assign an available port number between 1024 and 5000.

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

P.S. : Всегда используйте значение более 4000 для порта прослушивания!

+0

Так оно и было. Благодаря :) – Kermit

0

Вы проверили MaxConnections свойство, как описано в the documentation?

В этой документации также описано, как проверить ErrorCode для получения более подробной информации. Возможно, вам стоит изучить этот вариант.

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... 
    } 
} 
//... 
//... 
Смежные вопросы