2009-03-30 7 views
2
Socket socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
... 
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); 
... 
socket.Send(bytesSent, bytesSent.Length, 0); 
... 
bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0); 

Une fois que le socket a envoyé les données, le serveur ne répond pas et le programme attend une réponse. Comment arrêter de recevoir des données après 1000 millisecondes? ЫProblème avec les sockets en C#

Répondre

2

Définissez cette propriété avant d'appeler socket.Receive (...). De MSDN

socket.ReceiveTimeout = 1000; 
+0

cela ne fonctionne pas –

0

Selon this MS article, vous devez appeler accepter avant de recevoir et de vous connecter avant Envoyer.

+0

J'ai appelé Connect et avec Accepter cela ne fonctionne pas aussi. Avec certains serveurs cela fonctionne, mais si un serveur est lent, le programme s'arrête. –

+0

Que voulez-vous dire le serveur est lent le programme s'arrête? Je pensais que vous vouliez qu'il quitte après un certain délai? Pouvez-vous poster plus de détails dans votre message principal (par exemple: tout le code de connexion)? – Mark

2
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
socket.RecieveTimeout = 1000; 
socket.SendTimeout = 1000; 

// Not needed 
// socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000); 

IPAddress ipAddress = IPAddress.Parse("192.168.2.2"); 
int port = 9000; 

try 
{ 
    // could take 15 - 30 seconds to timeout, without using threading, there 
    // seems to be no way to change this 
    socket.Connect(ipAddress, port); 

    // Thanks to send timeout this will now timeout after a second 
    socket.Send(bytesSent, bytesSent.Length, 0); 

    // This should now timeout after a second 
    bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0); 
} 
finally 
{ 
    socket.Close(); 
} 
1

Au lieu de relyinging sur la Socket.ReceiveTimeout pour faire le travail, vous pouvez utiliser Socket.Poll(). L'utilisation du ReceiveTimeout lève une exception lorsqu'un délai d'attente se produit, alors que Poll() ne déclenche pas. Vous serez désormais en mesure de gérer un délai d'expiration d'une manière plus gracieuse.

var received = -1; 
var receiveBuffer = new byte[_receiveBufferSize]; 

// The poll will timeout after 5 seconds (Defined in microseconds) 
var canRead = _socket.Poll(5000000, SelectMode.SelectRead); 
if(canRead) 
    received = _socket.Receive(receiveBuffer); 

if (received > 0) 
{ 
    // Parse the buffer 
} 
else 
{ 
    // Do other stuff 
}