Проблема с сокетами в C #

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);

После того, как сокет отправил данные, сервер не отвечает, чтобы программа ожидала ответа. Как прекратить прием данных после 1000 миллисекунд? Ы

Теги:
sockets

4 ответа

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();
}
2

Установите это свойство перед вызовом socket.Receive(...). Из MSDN

socket.ReceiveTimeout = 1000;
  • 0
    это не работает
1

Вместо того чтобы полагаться на Socket.ReceiveTimeout для выполнения задания, вы можете использовать Socket.Poll(). Использование ReceiveTimeout вызовет исключение, когда произойдет тайм-аут, а Опрос() - нет. Теперь вы сможете обрабатывать таймаут более грациозным способом.

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
}
0

В соответствии с этой статьей MS вам необходимо позвонить "Принять до получения и подключения до отправки".

  • 0
    Я позвонил Connect и с Accept тоже не работает. С некоторыми серверами это работает, но если сервер работает медленно, программа останавливается.
  • 0
    Что значит сервер работает медленно программа останавливается? Я думал, что вы хотите, чтобы это прекратилось после истечения некоторого времени ожидания? Можете ли вы опубликовать более подробную информацию в своем основном сообщении (например, весь код подключения)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню