[c++]serwer-klient problem

0

Witam, otóż pisze program typu klient-serwer w konsoli, nie wiem jak zrobić tak abym mogł cały czas odbierać

dane i wysyłać równoczesnie (tak jak na czacie). Czytałem że trzeba zrobić ćos z wątkami, ale kompletnie nie

wiem o co z tym chodzi, więc jeżeli ktoś mogłby mi pokazać jakiś przykład z tym lub zmodyfikować odpowiednio

mój poniższy kod to będe wdzięczny.

SERWER:

#include <conio.h>
#include <iostream>
#include <winsock.h>
using namespace std;

char bufor[100];

void wyczysc(char bufor[])
{
 	 for(int i=0;i<sizeof(bufor);i++)
 	  {
	   		 bufor[i]=' ';
      }
}
main()
{
 	  WSADATA wsaData;
 	  SOCKET sock_serwer,sock_klient;
	  struct sockaddr_in sock_in;
	  int rozmiar = sizeof(sock_in);
 	  char nick[9],nick_2[9];
 	  
WSAStartup(MAKEWORD(2,0), &wsaData );
sock_serwer=socket(AF_INET, SOCK_STREAM, 0);

sock_in.sin_family = AF_INET; 
sock_in.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1" );
sock_in.sin_port = htons(10001);
memset(sock_in.sin_zero, 0, 8);
 
bind(sock_serwer,(sockaddr *)&sock_in, sizeof(sock_in));
listen(sock_serwer,2);
sock_klient = accept(sock_serwer,(sockaddr *)&sock_in, &rozmiar);

cout << "Podaj swoj nick: ";
cin.getline(nick_2,sizeof(nick_2));
cout << "Twoj nick to: " << nick_2 << endl;
send(sock_klient,nick_2,sizeof(nick_2),0);
recv(sock_klient,nick,sizeof(nick),0);
cout << endl;

do
{
cout << "Wpisz tekst: ";
cin.getline(bufor,sizeof(bufor));
send(sock_klient,bufor,sizeof(bufor),0);  	 
recv(sock_klient,bufor,sizeof(bufor),0);
if(bufor[0]!=' ')
{
cout << nick << " napisal: " << bufor << endl; 			   
}
wyczysc(bufor);
}
while(true);

getch();
		closesocket( sock_serwer );
		closesocket( sock_klient );
		WSACleanup();
	  }

KLIENT:

#include <winsock.h>
#include <conio.h>
#include <iostream>
using namespace std;


char bufor[100];

void wyczysc(char bufor[])
{
 	 for(int i=0;i<sizeof(bufor);i++)
 	  {
	   		 bufor[i]=' ';
      }
}

main()
{
 	  WSADATA wsaData;
 	  int blad,rozmiar;
	  char nick[9],nick_2[9];
	  SOCKET sock_klient;
	  struct sockaddr_in sock_in;
WSAStartup(MAKEWORD(2,0), &wsaData );
sock_klient = socket( AF_INET, SOCK_STREAM, 0 );  

sock_in.sin_family = AF_INET;
sock_in.sin_addr.S_un.S_addr=inet_addr( "127.0.0.1" );
sock_in.sin_port = htons(10001); 

connect(sock_klient,(sockaddr *) &sock_in, sizeof(sock_in));

recv(sock_klient,nick_2,sizeof(nick_2),0);
cout << "Podaj swoj nick: ";
cin.getline(nick,sizeof(nick));
cout << "Twoj nick to: " << nick << endl;
send(sock_klient,nick,sizeof(nick),0);

do
{							  
cout << "Wpisz tekst: ";
cin.getline(bufor,sizeof(bufor));
send(sock_klient,bufor,sizeof(bufor),0);
recv(sock_klient,bufor,sizeof(bufor),0);
if(bufor[0]!=' ')
{
cout << nick << " napisal: " << bufor << endl; 			   
}
wyczysc(bufor);
}
while(true);
getch();

		closesocket( sock_klient );
		WSACleanup();
	  }
0

<url>http://www.winapi.org/index.php?option=content&task=view&id=128&Itemid=36
</url>

rozwiazanie twojego problemu jest w linijce: WSAAsyncSelect(nasluchujacy,hWnd,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE);

pogrubione to komunikat, ktory musisz zdefiniowac, i ktory system wysle gdy socket cos odbierze. wiec robisz obsluge komunikatow i w momencie gdy system wysle ten twoj zdefiniowany komunikat oznacza to, ze socket cos odebral.

0

dzięki za odpowiedź ale nie chce korzystać z winapi, to ma być prosty komuniakator w konsoli więc to odpada

0

watki i tak bedziesz musial zrobic w api, chyba, ze znajdziesz inna klase do tego. albo twoj komunikator jest prosty i nefunkcjonalny albo funkcjonalny i mniej lub bardziej zlozony

0

niewiem czy coś pomoge nieprzeglądałem kodu więc niewiem ale poszukaj na 4p kodu Kliser w dziale kody źródłowe(c++)

0

Ok dzięki, później zerkne

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