No więc jestem już na ukończeniu moich aplikacji serwera i klienta w winsocku. Został właściwie tylko jeden mały problem... Ale jest on jednym z najdziwniejszych z jakimi się dotąd spotkałem...
//ExampleServer.cpp
...
DWORD WINAPI ReceiverThread(LPVOID ClientSocketDeskryptor) //wątek do odbierania wiadomości serwera
{
char message[200];
int CSD = *(reinterpret_cast<int*>(ClientSocketDeskryptor)); //przechowuje deskryptor gniazda
int i=100;//zmienna dodatkowa do debuggowania
char a = 'a'; //zmienna dodatkowa
int numbytes;
while(1)
{
memset(message,'\0',200);
cout<<"CSD= "<<CSD<<endl;
numbytes=recv(CSD,message,220,0); //[BREAKPOINT 1]
if(numbytes==0)//[BREAKPOINT 2]
{
break;
}
if(numbytes==-1)
{
cout<<"Error receiving message error nr "<<WSAGetLastError()<<endl;
continue;
}
if(message[0]=='\0')
{
continue;
}
cout<<message<<endl;
cin.ignore();
}
cout<<"Receiver exiting..."<<endl;
}
...
Powyższa funkcja to oddzielny wątek do obsługiwania odpowiedzi serwera. W ten sposób mogę jednocześnie pisać i odbierać wiadomości.
Niestety, wątek działa tylko podczas odbierania pierwszej wiadomości. Za każdym następnym razem w konsoli nie pojawia się nic. Wątek nie zakończył pracy, po prostu zawiesił się na pętli while(1) gdyż...no właśnie.
Spójrzcie na wyniki debugowania. Podglądałem zmienne CSD,i,a oraz numbytes.
[BREAKPOINT 1] (przed recv())
CSD=220
i=100
a='a'(97 ASCII)
[BREAKPOINT 2] (po recv())
CSD=1998210272 (różnie,generalnie śmieci)
i=0;
a=null(0 ASCII)
Nic dziwnego że za 2 razem nie działa skoro CSD to śmieci.Przekazanie tego do recv() zwraca -1 i funkcja blokuje się na pętli while()
No więc, ja nie mam pojęcia. Od wielu godzin siedzę i rozmyślam. Ale jakoś żadne wytłumaczenie mi do głowy nie przychodzi.Nigdy nie widziałem podobnego zjawiska. Ktokolwiek wpadnie na rozwiązanie dla mnie jest bogiem programowania!