C++.Сокеты.Функция RECV

вот это мой вопрос перед этим:
Делаю все как положено,открываю сокет на клиенте и сервере..доходит до момента когда сервер приложение должно прослушать клиент(для этого использую функцию recv),проблема в том что я ее закинул в таймер и когда он должен выполнить ее,он тупо зависает и ждет пока что-то придет,ломаю голову не знаю как правильно решить эту задачу,в гугле уже надоело искать.


Поспрашивал,говорят можно сделать отдельный поток что бы не зависало,но я в этом вообще не понимаю.Нашел функцию select,думал может поможет,но что-то нифига.Вот код тот что в таймере:
fd_set read_set, error_set;
				 struct timeval tv = {0,0};
					 tv.tv_sec = 1;
					 tv.tv_usec = 0;
					 FD_ZERO(&read_set);
					 FD_ZERO(&error_set);
					 FD_SET(sa, &read_set);
					 FD_SET(sa, &error_set);
					 if (select(sa + 1, &read_set, NULL, &error_set, &tv) == 1)
					 {
 if (FD_ISSET(sa, &read_set))
						 {
							 bytesRecv = recv(sa, recvbuf, 50, 0);
							 err = WSAGetLastError();// 10057 = A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) 
							 if (bytesRecv == 0 || bytesRecv == WSAECONNRESET) {

								 textBox1->Text = "Connection Closed.\n";
								 WSACleanup();
							 }
							 else{

								 textBox1->Text = gcnew String(recvbuf);

							 }
						 };
  • Вопрос задан
  • 4458 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Нашел функцию select,думал может поможет,но что-то нифига

Я тебе в ответе на тот вопрос писал ещё про fcntl и O_NONBLOCK, думал может ты читать умеешь, но что-то нифига. В винде их аналоги -- ioctlsocket и FIONBIO.
В качестве альтернативы можно попробовать ioctlsocket и FIONREAD, чтобы читать столько байт, сколько есть для чтения, а не 50.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы