Nierozwiązywalne sockety LAN - Warcaby C++

0

Dzień dobry,
Bardzo proszę o pomoc z moim projektem z warcab. Sama gra płynnie działa na jednym kumputerze, można bić promować itp. Jednak próbowałem połączyć się przez sockety by grać na local host. Chciałem w smfl przesyłąć buffor w tablicy char, nie korzystać z pakietów ponieważ przesyłam wyłącznie cztery cyfry: "1234" [Początkowa_X,Początkowa_Y,Docelowa_X,Docelowa_Y], konwertuje to do stringa przesyłam przez sokety i rozbijam znów na te cztery int'y. Mój kod jest trochę chaotyczny, ale wierzę że nie wiele mnie dzieli od rozwiązania tego problemu. Bardzo proszę o pomoc.

Podczas uruchomienia trzeba odpalić program .exe dwa razy, raz podać 's' - serwer, 'c' - client
kod: http://pastebin.com/EiWERt9q
main 939, inicjalizacja socketów 1005, 1117 wysyłanie socketów, 1191 odbieranie socketów

1

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;
}
//---------------------------------------------------------------------------

1 użytkowników online, w tym zalogowanych: 0, gości: 1