#include #include #include #define BUFSIZE 1000 using namespace std; int main(int argc, char *argv[]) { WORD wVersionRequested = MAKEWORD(1, 1); // Číslo verzie WSADATA data; // Struktura s info. o kniznici; std::string text; // prijimany text sockaddr_in sockName; // meno socketu sockaddr_in clientInfo; // Klient, ktory sa pripojil SOCKET mainSocket; // Socket int port; // Číslo portu char buf[BUFSIZE]; // Prijímací buffer int size; // Počet prijatych a odoslanych bytov int addrlen; // velkost adresy vzdialeneho PC int count = 0; // Počet pripojení if (argc != 2) { cerr << "Syntaxe:\n\t" << argv[0] << " " << "port" << endl; return -1; } // Pripravíme sockety na prácu if (WSAStartup(wVersionRequested, &data) != 0) { cout << "Nepodarilo se inicializovat sockety" << endl; return -1; } port = atoi(argv[1]); // Vytvoríme soket if ((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { cerr << "neda sa vytvorit socket" << endl; WSACleanup(); return -1; } // Zaplníme strukturu sockaddr_in // 1) Rodina protokolov; sockName.sin_family = AF_INET; // 2) Číslo portu, na kterom čekáme sockName.sin_port = htons(port); // 3) Nastavenie IP adresy lokálnej sieťovej karty, cez ktoru // je možne se pripojit. // Nastavíme možnost pripojit se odkialkolvek. sockName.sin_addr.s_addr = INADDR_ANY; //priradíme socketu meno if (//todo volanie funkcie bind == SOCKET_ERROR) { cerr << "Problem s pomenovanim socketov" << endl; WSACleanup(); return -1; } // Vytvorime frontu požiadavkov na spojenie. // Vytvoříme frontu maximálnej velkosti 10 požiadaviek. if (//volanie funkcie listen == SOCKET_ERROR) { cerr << "problem s vytvorenim fronty" << endl; WSACleanup(); return -1; } do { // Poznačím si velkost struktury clientInfo. // Predám to funkci accept. addrlen = sizeof(clientInfo); // Vyberiem z fronty poziadavku na spojenie. // "client" je nový socket spojující klienta so serverom. SOCKET client = accept(mainSocket, (sockaddr*)&clientInfo, &addrlen); int totalSize = 0; if (client == INVALID_SOCKET) { cerr << "Problém s prijatim spojenia" << endl; WSACleanup(); return -1; } // Zistím IP adresu klienta. cout << "Niekto sa pripojil z adresy: " << inet_ntoa((in_addr)clientInfo.sin_addr) << endl; // Prijmem data. Ku komunikacii s klientom používám socket "client" text = ""; // Prijmeme maximálne 6 bytový pozdrav. while (totalSize != 6) { if ((size = recv(client, buf, BUFSIZE - 1, 0)) == SOCKET_ERROR) { cerr << "Problem s prijatím dat." << endl; WSACleanup(); return -1; } cout << "Prijate: " << size << endl; totalSize += size; text += buf; } cout << text; // Odoslem pozdrav if ((size = send(client, "Nazdar\n", 8, 0)) == SOCKET_ERROR) { cerr << "Problém s odoslaním dat" << endl; WSACleanup(); return -1; } cout << "Odeslane: " << size << endl; // Uzavriem spojenie s klientem closesocket(client); } while (++count != 3); cout << "Končím" << endl; closesocket(mainSocket); WSACleanup(); return 0; }