Sciągnałem kod servera i kod clienta. Server i client działa na zasadzie:
- server nasluchuje na danym porcie
- client laczy sie z serverem
- server czeka na odebranie waidomosci
- client wysyla wiadomosc i czeka na odbior wiadomosci od serwer
- servwer czeka na wpisanie wiadomosci zeby ja odeslac do klienta
Chcialem przerobic tak zeby server nasluchiwal caly czas wiec zapetlilem program i
teraz jest ok jesli chodzi o odbieranie danych od kliku klinetow ktorzy sie polacza.
Ale w klinecie jest tak ze jak sie polacze i wysle wiadomosc to server ja odbierze
ale jak znowu wpisze kolejna to drugi raz juz jej nie widac. Musze sie rozlaczyc i
polaczyc ponownie. czy wiece jak mozna to przerobic by dzialalo tak ze klinet
moze wysylac dowolna ilosc wiadomości.
w kodzie dodalem petle while(true) ale nadal nie dziala
#include <winsock.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
//using namespace std;
int main(int argc, int **argv)
{
WSADATA wsda; // informacja zwrocona przez WSAStartup
struct hostent *host; // informacja o serwerze
char szMessage[80]; // komunikat
int iMessageLen;
int ret;
char szInBuffer[128];
int iBufferLen;
char szAddress[64];
int iPort;
SOCKET s; // uzywane gniazdo
SOCKADDR_IN addr; // adres hosta
// pobranie adresu IP
cout << "Podaj adres IP do ktorego wyslac (np. 127.0.0.1) ...";
cin.getline(szAddress,64,'\n');
// port na ktorym sie komunikujemy (0...65535)
iPort = 1000;
// zaladuj WinSock w wersji 2.2
WSAStartup(MAKEWORD(2,2), &wsda);
// stworzenie gniazda TCP
s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
// sprawdzenie bledu
if(s == SOCKET_ERROR)
{
cout << "Blad przy inicjalizacji gniazda : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
// informacja o hoscie
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = inet_addr(szAddress);
if(addr.sin_addr.s_addr == INADDR_NONE) // jesli nie podano numeru IP, to odnajdz go z DNS
{
host = NULL;
cout << "Szukam hosta..." << endl;
host = gethostbyname(szAddress); // pobierz numer IP i go zachowaj
if(host == NULL)
{
cout << "Nieznany host." << endl;
system("PAUSE");
exit(1);
}
memcpy(&addr.sin_addr, host->h_addr_list[0], host->h_length);
cout << "OK." << endl;
}
// laczenie z serwerem
cout << "Laczenie z hostem " << szAddress << " na porcie " << iPort << endl;
ret = connect(s, (struct sockaddr *) &addr, sizeof(addr));
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy laczeniu z serwerem : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
while(true) {
// pobranie komunikatu do bufora
cout << "Wpisz komunikat ...";
cin.getline(szMessage,80,'\n');
// dlugosc komunikatu
iMessageLen = strlen(szMessage);
// wyslanie komunikatu
cout << "Wysylanie pakietu..." << endl;
ret = send(s, szMessage, iMessageLen, 0);
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy wysylaniu komunikatu : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
}
// odbior komunikatu zwrotnego
cout << "Oczekiwanie na komunikat zwrotny..." << endl;
ret = recv(s, szInBuffer, sizeof(szInBuffer), 0);
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy odbiorze komunikatu zwrotnego : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
// wyswietlenie komunikatu zwrotnego
iBufferLen = ret;
szInBuffer[iBufferLen] = '\0';
cout << "Otrzymano komunikat o tresci \"" << szInBuffer << "\" od hosta " << szAddress << endl;
// zamkniecie gniazda
closesocket(s);
// zamkniecie WinSock
WSACleanup();
system("PAUSE");
return 0;
}