Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie]Winsock


GGG205

Rekomendowane odpowiedzi

Opublikowano

Witam wszystkich koderów ! Mam pewien problem i też zwracam się do was z pytaniem. Jeden to, kiedy serwer przesyła dane do hosta to: NAZWA KOMPUTERA i IP KOMPUTERA to zamiast otrzymać je w oddzielnych tabelach to się one łączą w jeden tekst. Może coś obrazek powie:

Beztytuup_nsrehpr.png

 

I drugie, czy przy odbieraniu danych używać sizeof, czy strlen <- kiedy tego używam nic nie dostaję, a zwraca, że wysyłanie się powiodło.

Trzecie: Czytałem to http--,,--//cpp0x.pl/kursy/Kurs-WinSock-C++/Troche-zaawansowane-techniki/277 ale nie próbowałem tego użyć, to by rozwiązało sprawę ?

 

KOD SERWERA:

int main(int argc, char * argv[])
{

    WSAData wsaData;

	WSAStartup( MAKEWORD( 2, 2),&wsaData );

	SOCKET mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);
	sockaddr_in service;
	memset( & service, 0, sizeof( service ) );
	service.sin_addr.s_addr = inet_addr( "89.70.161.185" );
	service.sin_family = AF_INET;
	service.sin_port = htons( 20001 );

	char Name[1024];
	char recvbuf[MAX_PATH];
	int Result;
    int len = sizeof(service);
	DWORD size = sizeof(size);
	GetUserName(Name,&size);
	


	cout << "Connect..." << endl;

	if( connect( mainSocket, ( SOCKADDR* )&service, sizeof( service ) ) == SOCKET_ERROR)
	   {
				 cout << "error"; 
				 getch();
			      WSACleanup();
				  return 1;
	   }

	cout << "Connected" << endl;

	u_long mode = 1;
	ioctlsocket(mainSocket,FIONBIO,&mode);
    if(getpeername(mainSocket,(SOCKADDR*)&service,&len) == -1)
		perror("ERROR: Function getpeername()");
//-----------------------------------------------------------------	
	cout << "Send data - 'IP computer'..." << endl;

	char* IPy = inet_ntoa(service.sin_addr);

	Result = send(mainSocket,IPy,strlen(IPy),0);
	if(Result == SOCKET_ERROR)
		perror("ERROR: Failed send message");
	else cout << "SUCCESS: Send data - 'IP computer'" << endl;
//------------------------------------------------------------------
	cout << "Send data - 'Name computer'..." << endl;

	Result = send(mainSocket,Name,strlen(Name),0);
	if(Result == SOCKET_ERROR)
		perror("ERROR: Failed send message");
	else cout << "SUCCESS: Send data - 'Name computer'" << endl;

    getch();
    return 0;
}

KOD CLIENTA

int iNET()
			{
				WSAData wsaData;
	            WSAStartup( MAKEWORD( 2, 2),&wsaData );

	            mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

				if(mainSocket == INVALID_SOCKET) 
					MessageBox::Show("Nie można utworzyć połączenia. PROBLEM: Socket()", "Błąd !",MessageBoxButtons::OK,  MessageBoxIcon::Stop);

				u_long iMode=1;
	            ioctlsocket(mainSocket,FIONBIO,&iMode);

	            sockaddr_in service;
	            memset( & service, 0, sizeof( service ) );
	            service.sin_addr.s_addr = inet_addr( "192.168.0.11" );
	            service.sin_family = AF_INET;
	            service.sin_port = htons( 20001 );

				char Buffor[MAX_PATH] = {0};

				if(bind(mainSocket,(SOCKADDR*)&service,sizeof(service)) == SOCKET_ERROR)
				{
					 MessageBox::Show("Nie można utworzyć połączenia. PROBLEM: bind()", "Błąd !",MessageBoxButtons::OK,  MessageBoxIcon::Stop);
					 return 1;
				}

				SOCKET acceptSocket = SOCKET_ERROR;

				button1->Enabled = false;

				listen(mainSocket,1);
					
	            while(acceptSocket==SOCKET_ERROR)
	            {
		           toolStripStatusLabel1->Text = "Łączę...";
		           acceptSocket=accept(mainSocket,NULL,NULL);
	            }

				mainSocket = acceptSocket;
				MessageBox::Show("Pomyślnie połączono z komputerem", "Informacja",MessageBoxButtons::OK,  MessageBoxIcon::Information);

				recv(mainSocket,Buffor,sizeof(Buffor),0);
				String^ NameI = gcnew String(Buffor);
				label3->Text = NameI;

				recv(mainSocket,Buffor,strlen(Buffor),0);
				String^ NameC = gcnew String(Buffor);
				label4->Text = NameC;

				//Buffor[0] = char(0);

				return 0;

			}
Weteran
Opublikowano

I drugie, czy przy odbieraniu danych używać sizeof, czy strlen <- kiedy tego używam nic nie dostaję, a zwraca, że wysyłanie się powiodło.

Funkcja recv zwraca rozmiar odebranego pakietu http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

A co do pierwszego pytania, to niestety bez kodu źródłowego tego programu nie jest w stanie powiedzieć w czym problem.

Weteran
Opublikowano

Wysyłasz dwa pakiety jeden za drugim, więc te dwa pakiety zostają jakby złączone w całość poprzez magiczny bufor, którego niestety nie da się flushować. Musisz wziąć to pod uwagę i np. na końcu każdego pakietu stawiać określony znak, tak żeby można było sprawdzić gdzie kończy się pierwszy pakiet, a gdzie zaczyna się drugi, lecz lepiej byłoby, żeby serwer po każdym odebranym pakiecie, wysyłał do klienta tj. pakiet kontrolny, dzięki któremu klient wiedziałby, że serwer dostał poprzedni pakiet i że można wysłać następny.

 

Poza tym, adres klienta można poznać choćby tak:

sockaddr_in addr;
int size = sizeof(addr);
...
asocket = accept(mainsocket, (sockaddr*) &addr, &size);
...
char *buff = inet_ntoa(addr.sin_addr);
 
Opublikowano

 

Wysyłasz dwa pakiety jeden za drugim, więc te dwa pakiety zostają jakby złączone w całość poprzez magiczny bufor, którego niestety nie da się flushować. Musisz wziąć to pod uwagę i np. na końcu każdego pakietu stawiać określony znak, tak żeby można było sprawdzić gdzie kończy się pierwszy pakiet, a gdzie zaczyna się drugi, lecz lepiej byłoby, żeby serwer po każdym odebranym pakiecie, wysyłał do klienta tj. pakiet kontrolny, dzięki któremu klient wiedziałby, że serwer dostał poprzedni pakiet i że można wysłać następny.

 

Poza tym, adres klienta można poznać choćby tak:

sockaddr_in addr;
int size = sizeof(addr);
...
asocket = accept(mainsocket, (sockaddr*) &addr, &size);
...
char *buff = inet_ntoa(addr.sin_addr);
 

Dzięki za odpowiedź, jutro po szkolę zastosuję się do twojej rady i napiszę efekty, a co do uzyskiwanie adresu to zapamiętam tą informacje i masz za te rady like.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...