Sockety problem

0

Witam,
no i padło na mnie. Muszę napisać aplikację sieciową w zacnym języku CPP. Mało czasu i zbyt duży nawał innych zajęć zmusił mnie do prężnej nauki socketów. Udało mi się coś sklecić z pomocą tutków. Tylko jest problem. Mam dwóch klientów łączących się do serwera. Klienci wysyłają wiadomości, serwer je odbiera, wyświetla i jest wszystko pięknie. Tylko jak chce przekazać wiadomość od klienta a do klienta b to wtedy się dzieją cuda.

Czy dla klienta też trzeba zrobić dwa osobne procesy do wysyłania i odbierania? Za wszelkie sugestie i podpowiedzi będę wielce wdzięczny.
Pozdrawiam

Klient

int wysylanie() {
  string IP,nick ;
  cout << "Podaj IP serwera\n";
  cin >>IP;
  cout << "Podaj nick: " ;
  cin >> nick;
  

 try
    {
	while(true) {
      ClientSocket client_socket ( "IP", 30000 );

      char reply[100];
      string data;
      client_socket << nick;
      try
	{
	  cout << "Wyslij: ";
	  cin.getline(reply, sizeof(reply));
	  client_socket << reply;
	  client_socket >> data;
	  cout << data;
	}
      catch ( SocketException& ) {}
	  
     }
}
  catch ( SocketException& e )
    {
      cout << "Exception was caught:" << e.description() << "\n";
    }

  return 0;
  
} 

Serwer

int main ()
{
try
    {
      ServerSocket server ( 30000 );

switch(fork()){
  case -1:
      cout << "Nie mozna utworzyc procesu.\n" ;
      exit(1);
      break;
  case 0:
    
    while (true) {
	  server.accept ( new_sock );
	  new_sock >> nick;
	  try
	    {
	      while ( true )
		{
		  
		  new_sock >> data;
		  cout << nick << ": "<< data << endl;
		  bufor = data;
		  
		}
	    }
	  catch ( SocketException& ) {}
	}  
	
    break;
    
  default:
      while (true) {
	  server.accept ( new_sock1 );
	  new_sock1 >> nick1;
	  try
	    {
	      while ( true )
		{
		  
		  new_sock1 >> data1;
		  cout << nick1 << ": " << data1 << endl;
		  new_sock1 << bufor;
		}
	    }
	  catch ( SocketException& ) {}
	}
	break;
      }
    }
  catch ( SocketException& e )
    {
      cout << "Exception was caught:" << e.description() << "\nExiting.\n";
    } 
    return 0;
}
 
0

A potrafisz napisać w czym problem? Bo wstawiłeś trochę spaghetti i magiczne zdanie "nie działa" i czego oczekujesz? o_O
Poza tym co to za biblioteka do socketów której używasz?
Zasadniczo musisz mieć to zrobione wielowątkowo jeśli chcesz móc albo odbierać albo wysyłać bez czekania. Jeśli pisałbyś z użyciem linuxowych socketów to mógłbyś też pomyśleć nad wykorzystaniem funkcji select() z pomocą której można wyeliminować potrzebę zabawy wątkami.

0

Piszę pod linuxem także i biblioteki są z nim związane.
Problem jest w tym, że jak dodam do klienta te dwie linijki:

client_socket >> data;
cout << data;
 

Wtedy nie da się wysłać wiadomości. Domyślam się, że trzeba tu zastosować wątki albo select. Tylko z wątkami nie miałem do czynienia (programowanie równoległe mnie ominęło :/). I tkwie przy tym.

0

Ale czego oczekujesz? Że ktoś to napisze za ciebie? Korzystanie z select() jest opisane w manualu, przy czym do niego potrzebujesz deskryptory tych socketów, a z tego co widzę to korzystasz z jakiejs obiektowej biblioteki do socketów (która nijak się ma do jakiegokolwiek standardu), a stwierdzenie "Piszę pod linuxem także i biblioteki są z nim związane" na prawdę nie jest zbyt pomocne. Skoro piszesz pod linuxem to masz wątki z pthread, wykorzystaj je i już.

0

albo fork() zwykłe

0

W "BJ's guide by network programming" jest świetny przykład serwera z użyciem fork().

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