Trudno sie to czyta, dużo sie napisałeś
Pierwszy problem to send i recv - funkcja nie daje gwarancji ani wysłania ani zwrotu tylu bajtów ile zadeklarujesz, czasami zwraca mniej. Jest dobrze na loopbacku problem zaczyna sie w realnej sieci.
Mój sposób to:
__int32 __stdcall ts::socket::send_for_sure(SOCKET a_main_socket,const char *a_send_lp, const __int32 a_len, const __int32 a_x)
{
#ifdef __DEBUG_SOCKET__
__DEBUG_FUNC_CALLED__
#endif
register __int32 s = 0;
register __int32 s_sum = 0;
register __int32 to_s = a_len;
while(s_sum<to_s) {
s = send(a_main_socket,&a_send_lp[s_sum],to_s-s_sum,0);
if (s<0) break;
else if (s>0) s_sum += s;
else ts::time::wait_ms(22);
}
ts::con::printf("send_for_sure(%d); sent: %dB\n", a_main_socket, s_sum );
ts::con::printf("-----------------------------------------------------------------------\n");
ts::con::printf("%s\n", a_send_lp );
ts::con::printf("-----------------------------------------------------------------------\n");
return s_sum;
}
//---------------------------------------------------------------------------
__int32 __stdcall ts::socket::recv_for_sure(SOCKET a_main_socket, char *a_recv_lp, const __int32 a_len, const __int32 a_x)
{
#ifdef __DEBUG_SOCKET__
__DEBUG_FUNC_CALLED__
#endif
register __int32 r = 0;
register __int32 r_sum = 0;
register __int32 to_r = a_len;
ts::mem32::set(a_recv_lp,0,to_r);
do {
r = recv(a_main_socket,&a_recv_lp[r_sum], to_r-r_sum, 0);
if (r <0 || r==WSAECONNRESET || r==SOCKET_ERROR) break;
else if (r==0) ts::time::wait_ms(22);
else r_sum+=r;
} while (r_sum>=to_r);
ts::con::printf("recv_for_sure(%d); received: %dB\n", a_main_socket, r_sum );
ts::con::printf("-----------------------------------------------------------------------\n");
ts::con::printf("%s\n", a_recv_lp );
ts::con::printf("-----------------------------------------------------------------------\n");
return r_sum;
}
//---------------------------------------------------------------------------