2012-04-23 5 views
1

Я пишу сервер сокета, и я заметил, что если он получил пустой буфер сокета, это вызовет возникновение сокета. В приемном вызове, как я могу обнаружить и обработать пустой буфер и отправить ответ -1 на клиента до закрытия сокета?Как обрабатывать пустой буфер буфера

Код:

try 
{ 
    byte[] byteBuffer = new Byte[1024]; 
    int size = m_clientSocket.Receive(byteBuffer); 
    if (size > 0) 
    { 
     ParseReceiveBuffer(byteBuffer, size); 
    } 
    else 
    { 
     m_clientSocket.Send(BitConverter.GetBytes(-1)); 
    } 
} 
catch (SocketException ex) 
{ 
    if (ex.SocketErrorCode == SocketError.WouldBlock || 
     ex.SocketErrorCode == SocketError.IOPending || 
     ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) 
    { 
     // socket buffer is probably empty, wait and try again 
     Thread.Sleep(1000); 
    } 
    // connection was unexpectively closed 
} 
+0

Неясно, что вы имеете в виду. Я бы только ожидал, что 'Receive' вернет 0, когда другой конец все равно отключит сокет. Что * точно * вы подразумеваете под «если он получил пустой буфер сокета»? –

ответ

0

используя DataAvailable пункт в надлежащем использовании. Я рекомендую вам написать полный класс и вспомогательные методы для выполнения всех этих регулярных. и thread.sleep (1000) не нужны, так как слушатель будет ждать выполнения вашей командной строки. В другом подходе используется разработанная библиотека сокетов, в которой вы можете легко имитировать как серверные, так и клиентские роли. Я знаю суперсокет с тем, что вы можете настроить и разработать свой собственный протокол.

1

Предполагая, что вы работаете с уровнем TCP.

Функции сокетов, такие как Send and Receive, фактически не отправляют и не принимают данные по сети. Они взаимодействуют с слоями сокетов ОС, чтобы выталкивать или удалять данные из сетевого уровня. Из-за этого при запуске из вашего метода отправки Отправить он будет помещать данные очереди для отправки в сетевой уровень ОС. Только после того, как эта ОС действительно отправит его и может получить некоторые проблемы, таким образом, он будет хранить ошибку и сразу же отправит ее прямо из вашего приложения сокета.

Именно поэтому вы получаете SocketException только при следующем вызове, если предыдущий может быть неудачным, или между предыдущей и текущей сетью вызовов произошла некоторая ошибка (например, потеря соединения).

Когда будет получено исключение, вы всегда ничего не получите (нулевые байты). Вы не можете отправить ничего после исключения из-за потери соединения (в большинстве случаев (99%)).

Клиент также получит исключение, которое будет иметь сообщение об ошибке о связи.

Смежные вопросы