2014-02-13 5 views
-1

Я использую VS 2008 для реализации сервера, который получает соединение сокета от клиента. Я использовал образец кода MSDN для этого, и он действительно работает для меня в первый раз. . Моя информация от автора клиента заключается в том, что перед первым запросом он пытается квитироваться, а затем отправить свой первый запрос. Я действительно хорошо это понимаю. После этого я отправляю ответ клиенту, который также получает его. Но теперь моя проблема начинается: Клиент начинает отправлять мне запросы, но я ничего не получаю !!! Я не уверен в моей реализации, поскольку в примере MSDN есть только один запрос. Может ли кто-нибудь объяснить, в чем разница между получением первого запроса и второго? Должен ли я использовать Socket.Accept() для каждого запроса или после того, как у меня есть восстановленный сокет из функции Socket.Accept(), я просто использую Socket.Receive()?Сервер сокета не получает второй запрос

Мой код основан на образце MSDN здесь:

listener.Bind(localEndPoint); 

listener.Listen(10); 

// Start listening for connections. 

Console.WriteLine("Waiting for a connection..."); 

// Program is suspended while waiting for an incoming connection. 

Socket handler = listener.Accept(); 

data = null; 

SocketError errorCode; 

// An incoming connection needs to be processed. 

while (true) 

{ 

bytes =new byte[1024]; 

handler.ReceiveTimeout = 2000; 

int bytesRec = handler.Receive(bytes,0,1024,0,out errorCode); 

data +=Encoding.ASCII.GetString(bytes, 0, bytesRec); 


Console.WriteLine("Text received : {0}", data); 

string answer = "my answer to client"; 

// Echo the data back to the client. 

byte[] msg = Encoding.ASCII.GetBytes(answer); 

handler.Send(msg); 


} 

Мои результаты первый раз я получаю некоторые данные в bytesRec и отправить ответ клиенту. Тогда я больше ничего не получаю в bytesRec, но полученный прерван из-за ошибки времени.

Спасибо заранее,

+0

Не могли бы вы форматировать свой код, чтобы он был читабельным? –

ответ

1

Вы называете Socket.Receive() столько раз, сколько требуется, чтобы получить каждое сообщение, а затем продолжать называть его, чтобы получить следующее сообщение, и так далее.

Обратите внимание, что вызовы из Receive() на одном конце соединения являются не во взаимно однозначном соответствии с вызовами Send() на другом конце . Если вы хотите отправить «сообщения», вам, как правило, нужно реализовать это в верхней части сокетов - например, префикс каждого сообщения с его длиной, используя сообщения с фиксированной длиной и т. д. или использовать примитив с более высоким уровнем сети.


Так один вызов Receive() может извлекать только часть сообщения, или получить несколько сообщений, или получить конец одного сообщения, один или более полных сообщений, и начало другого сообщения, и т. д.

+0

Socket.Recieve() хорошо после получения данных от клиента. Дело здесь в том, что в мой сокет не попадают данные ... Так что, пожалуйста, объясните, что такое Accept vs Recieve? – gelly

+0

@ gelly - если вы хотите, чтобы мы диагностировали/отлаживали ваш код, вам нужно будет показать нам некоторые из них. Возможно, если вы сможете создать [SSCCE] (http://sscce.org/) и показать нам, что мы можем вам помочь. –

+0

Редактировать мой вопрос с помощью кода. Спасибо. – gelly

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