my_socket.Poll(-1, SelectMode.SelectRead);
int len = my_socket.Available;
byte[] tmpBuf;
tmpBuf = new byte[cb_length]; // 16 байт, там столько и должно быть
my_socket.Receive(tmpBuf, cb_length, SocketFlags.None);
cb = parse_cb(tmpBuf); // разбираем структуру
if (cb.MN != Magic())
return;
if (cb.command == 1) { // Getting all Library
my_socket.Poll(1000, SelectMode.SelectRead); // проблемное место
len = my_socket.Available;
tmpBuf = new byte[len];
my_socket.Receive(tmpBuf);
lib = ParseLib(tmpBuf);
return;
}
Пропадает пакет
С#:
Код:
С++:
Код:
int ret;
unsigned long len;
char* tmpBuf;
fd_set my_set;
my_set.fd_count = 1;
my_set.fd_array[0] = socket;
select(1, &my_set, 0, 0, 0);
ret = ioctlsocket(socket, FIONREAD, &len);
printf("Socket contains %d bytes of data\n", len);
tmpBuf = new char[16];
recv(socket, tmpBuf, 16, 0);
memcpy(&cb, tmpBuf, 16);
if ( cb.MN != MAGIC )
return;
if ( cb.command == 1 ) { // Getting all Library
select(1, &my_set, 0, 0, 0);
ret = ioctlsocket(socket, FIONREAD, &len);
tmpBuf = new char[len];
recv(socket, tmpBuf, len, 0);
ParsLib( tmpBuf );
return;
}
unsigned long len;
char* tmpBuf;
fd_set my_set;
my_set.fd_count = 1;
my_set.fd_array[0] = socket;
select(1, &my_set, 0, 0, 0);
ret = ioctlsocket(socket, FIONREAD, &len);
printf("Socket contains %d bytes of data\n", len);
tmpBuf = new char[16];
recv(socket, tmpBuf, 16, 0);
memcpy(&cb, tmpBuf, 16);
if ( cb.MN != MAGIC )
return;
if ( cb.command == 1 ) { // Getting all Library
select(1, &my_set, 0, 0, 0);
ret = ioctlsocket(socket, FIONREAD, &len);
tmpBuf = new char[len];
recv(socket, tmpBuf, len, 0);
ParsLib( tmpBuf );
return;
}
Разница между этими двумя кусками кода: в первом, даже при бесконечном ожидании, не приходит второй пакет (если руками докинуть третий, то третий придет). В чем может быть проблема?
Какой протокол использует сокет??