Winsock c++


(Maleckrystian) #1

Pisze program w c++ winsock i mam taki problem mam zrealizowane wysyłanie danych od klienta do serwera a następnie serwer odsyła komunikat i program się kończy. Czy istnieje możliwość aby zapętlić tą część  ?  a może muszę użyć jakieś funkcji do tego ?


(stasinek) #2

pokaż kod bo nie wiem w czym moze być problem :stuck_out_tongue:

w uproszczeniu
while(1)
{
odebrano = recv(bufor); //ma działanie blokujące wątek
for (sent = 0; sent < to_send;) sent += send(&bufor[sent],to_send-sent);
}

recv trzeba sprawdzać ile otrzymał bo mógł się rozłączyć z serwerem a błąd też jest wartością zwrotną w rozmiarze, w send - trzeba sprawdzać ile wysłał i zapętlić aż suma wartości zwracanej będzie = sumie do wysłania i dopiero przejść do kolejnego etapu(ponowne pobieranie)

warunek wyjścia sam ustalasz

albo serwer wyśle odpowiedni komunikat wiec sobie wyszukujesz w buforze słów kluczy albo czekasz aż serwer rozłączy i wywali błąd recv

buffer.recv_done_count = recv( main_socket,buffer.recv_lp,MAX_REQUEST,0 );
if (buffer.recv_done_count == 0 || buffer.recv_done_count == WSAECONNRESET || buffer.recv_done_count  < 0 || buffer.recv_done_count == SOCKET_ERROR)
break;

 

co do send to ja sobie zrobiłem send_for_sure i recv_for_sure

__int32__ stdcall tsoft::socket::send_for_sure(SOCKET amain_socket,char *asend_lp, __int32 alen,__ int32 ax)
{
register __int32 s = 0;
register __int32 s_sum = 0;
register __int32 to_s = alen;
while(s_sum<to_s) {
s =  send(amain_socket,&asend_lp[s_sum],to_s-s_sum,0);
if (s<0) break;
else if (s>0) s_sum += s;
else {
#ifdef WIN32
Sleep(22);
#else
usleep(22*1000);
#endif
}
}
printf( "send_for_sure(%d); sent: %dB\n", amain_socket, s_sum );
printf( "-----------------------------------------------------------------------\n");
printf( "%s\n", asend_lp );
printf( "-----------------------------------------------------------------------\n");
return s_sum;
}
//---------------------------------------------------------------------------


__int32__ stdcall tsoft::socket::recv_for_sure(SOCKET amain_socket, char *arecv_lp, __int32 alen,__ int32 ax)
{
register __int32 r = 0;
register __int32 r_sum = 0;
register __int32 to_r = alen;
tsoft::mem32::set(arecv_lp,0,to_r);
do {
r = recv(amain_socket,&arecv_lp[r_sum], to_r-r_sum, 0);
if (r <0 || r==WSAECONNRESET || r==SOCKET_ERROR) break;
else if (r==0) {
#ifdef WIN32
Sleep(22);
#else
usleep(22*1000);
#endif
} else r_sum+=r;
} while (r_sum>=to_r);
printf( "recv_for_sure(%d); received: %dB\n", amain_socket, r_sum );
printf( "-----------------------------------------------------------------------\n");
printf( "%s\n", arecv_lp );
printf( "-----------------------------------------------------------------------\n");
return r_sum;
}
//---------------------------------------------------------------------------