(1) Ваш буфер на самом деле не выделен, он находится в стеке.Обычно вам не нужно беспокоиться об использовании 32 байтов в стеке.
(2) recv
должен блокироваться до тех пор, пока ему не будет что-то получить.Вы можете обойти это, используя неблокирующие сокеты или select
.См. здесь для справки.
В частности, вы можете
(2a) Использовать ioctlsocket , чтобы установить сокет в неблокирующий режим.Затем, когда вы звоните read
и читать нечего, вы получаете ошибку EWOULDBLOCK
.
unsigned long non_blocking = 1;
ioctlsocket (sockClient, FIONBIO, &non_blocking);
Тогда чтение становится
bytesRcvd = recv(sockClient, buffer, RCVBUFSIZE - 1, 0);
if (bytesRcvd == -1) {
if (WSAGetLastError() == EWOULDBLOCK) {
// nothing to read now
} else {
// an actual error occurred
}
} else {
// reading was successful. Call to MsgBox here
}
(2b) илиВы можете позвонить , выбрать , чтобы определить, есть ли данные для чтения, прежде чем на самом деле вызвать read
.
struct timeval timeout;
timeout.tv_usec = 0;
timeout.tv_sec = 0;
fd_set r;
FD_ZERO (&r);
FD_SET (sockClient, &r);
switch (select (sockClient + 1, &r, NULL, NULL, &timeout)) {
case -1:
// error
break;
case 0:
// nothing to read
break;
case 1:
// you may call read ()
break;
}
.