Teo@Unix
02-03-2010, 16:35
Ciao, ho un problemino con questo codice, non ho mai usato la select() sotto windows, su MSDN mi sembra che sia uguale....
però questo spezzone di codice ha un problema... select ritorna sempre e si ferma ogni volta su read().. il risultato è che sembra funzionare correttamente ma se l'invio richiede due cicli di recv() i dati in ricezione rimangono ingabbiati nel buffer di recv() e vengono stampati solo dopo, ovvero al prossimo mio input... se non mi sto confondendo con altro praticamente select() non stà funzionando....
è sbagliato usare select() in questo modo sotto windows?
while(1)
{
printf("\n# ");
FD_SET(_fileno(stdin),&rset);
FD_SET(sock,&rset);
select(0,&rset,NULL,NULL,NULL);
if(FD_ISSET(_fileno(stdin),&rset))
{
memset(send_buffer,0,BUF_SIZE);
if(fgets(send_buffer,BUF_SIZE,stdin) == NULL)
ErrMngmnt(FGETS_ERROR);
if(send(sock,send_buffer,BUF_SIZE,0) == SOCKET_ERROR)
ErrMngmnt(WSAGetLastError());
}
if(FD_ISSET(sock,&rset))
{
memset(recv_buffer,0,BUF_SIZE);
if(recv(sock,recv_buffer,BUF_SIZE,0) == SOCKET_ERROR)
ErrMngmnt(WSAGetLastError());
fprintf(stdout,"%s",recv_buffer);
fflush(stdout);
}
}
oppure se do cd / ecc...
(il server che non da output per un cambiamento di cartella) il client rimane ingarbugliato
però questo spezzone di codice ha un problema... select ritorna sempre e si ferma ogni volta su read().. il risultato è che sembra funzionare correttamente ma se l'invio richiede due cicli di recv() i dati in ricezione rimangono ingabbiati nel buffer di recv() e vengono stampati solo dopo, ovvero al prossimo mio input... se non mi sto confondendo con altro praticamente select() non stà funzionando....
è sbagliato usare select() in questo modo sotto windows?
while(1)
{
printf("\n# ");
FD_SET(_fileno(stdin),&rset);
FD_SET(sock,&rset);
select(0,&rset,NULL,NULL,NULL);
if(FD_ISSET(_fileno(stdin),&rset))
{
memset(send_buffer,0,BUF_SIZE);
if(fgets(send_buffer,BUF_SIZE,stdin) == NULL)
ErrMngmnt(FGETS_ERROR);
if(send(sock,send_buffer,BUF_SIZE,0) == SOCKET_ERROR)
ErrMngmnt(WSAGetLastError());
}
if(FD_ISSET(sock,&rset))
{
memset(recv_buffer,0,BUF_SIZE);
if(recv(sock,recv_buffer,BUF_SIZE,0) == SOCKET_ERROR)
ErrMngmnt(WSAGetLastError());
fprintf(stdout,"%s",recv_buffer);
fflush(stdout);
}
}
oppure se do cd / ecc...
(il server che non da output per un cambiamento di cartella) il client rimane ingarbugliato