Помогите с курсаком. С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Alexandr_, 22 Apr 2012.

  1. _Alexandr_

    _Alexandr_ New Member

    Joined:
    6 May 2011
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    Всем доброго времени. Нам курсовой дали,и моя тема это сокеты. Препод в двух словах объяснил что мол нужно два кода. Клиент и сервер. И объяснить что к чему. Но сделаю акцент на том,что объяснил в двух словах... Так уж вышло,что никто ничем у нас в технаре не озадачен и препод наш особо с курсаком и не помагает и на уроках сам был инициатором CS-х матчей. В общем с системным дело у нас у всех туго. Я б даже сказал оочень туго. После я не много поразкинул тем что осталось и решил,что это самый нормальный форум и если Вы не поможете,то и вообще никто не поможет. Объясните пожалуйста по доступнее про сокеты. И что там писать в курсаке нужно, по предметную область и т.д В общем кто что может :) И извените за наглость,но если не влом будет, то напишите пару строк или ссылок по теме кодировки данных. Нужно из UTF8 в ANSI и наооборот текст гонять. Спасибо за внимание и за будущие ответы. Больше мне особо не на кого надеятся.
     
  2. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Читай игры на сокетах.
     
  3. _Alexandr_

    _Alexandr_ New Member

    Joined:
    6 May 2011
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    А сцыль можно?
     
  4. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    http://citforum.ru/book/cook/winsock.shtml
     
  5. tester_new

    tester_new Elder - Старейшина

    Joined:
    12 Feb 2012
    Messages:
    300
    Likes Received:
    45
    Reputations:
    24

    СЕРВЕР

    Code:
    // Пример простого TCP-эхо-сервера
    
    #include <stdio.h>
    #include <winsock2.h> // Wincosk2.h должен быть раньше windows!
    #include <windows.h>
    
    #define MY_PORT 666 // Порт, который слушает сервер 666
    
    // макрос для печати количества активных пользователей
    #define PRINTNUSERS if (nclients) printf("%d user on-line\n", nclients); \
            else printf("No User on line\n");
    
    // прототип функции, обслуживающий подключившихся пользователей
    DWORD WINAPI SexToClient(LPVOID client_socket);
    
    // глобальная переменная - количество активных пользователей
    int nclients = 0;
    
    int main(int argc, char* argv[])
    {
        char buff[1024]; // Буфер для различных нужд
    
        printf("TCP SERVER DEMO\n");
        // Шаг 1 - Инициализация Библиотеки Сокетов
        // т.к. возвращенная функцией информация не используется
        // ей передается указатель на рабочий буфер, преобразуемый к указателю
        // на структуру WSADATA.
        // Такой прием позволяет сэкономить одну переменную, однако, буфер
        // должен быть не менее полкилобайта размером (структура WSADATA
        // занимает 400 байт)
        if (WSAStartup(0x0202, (WSADATA *)&buff[0]))
        {
            // Ошибка!
            printf("Error WSAStartup %d\n", WSAGetLastError());
            return -1;
        }
    
        // Шаг 2 - создание сокета
        SOCKET mysocket;
        // AF_INET - сокет Интернета
        // SOCK_STREAM - потоковый сокет (с установкой соединения)
        // 0 - по умолчанию выбирается TCP протокол
        if ((mysocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            // Ошибка!
            printf("Error socket %d\n", WSAGetLastError());
            WSACleanup(); // Деиницилизация библиотеки Winsock
            return -1;
        }
    
        // Шаг 3 - связывание сокета с локальным адресом
        sockaddr_in local_addr;
        local_addr.sin_family = AF_INET;
        local_addr.sin_port = htons(MY_PORT); // не забываем о сетевом порядке!!!
        local_addr.sin_addr.s_addr = 0; // сервер принимает подключения
                                        // на все свои IP-адреса
    
        // вызываем bind для связывания
        if (bind(mysocket, (sockaddr *)&local_addr, sizeof(local_addr)))
        {
            // Ошибка
            printf("Error bind %d\n", WSAGetLastError());
            closesocket(mysocket); // закрываем сокет!
            WSACleanup();
            return -1;
        }
    
        // Шаг 4 - ожидание подключений
        // размер очереди - 0x100
        if (listen(mysocket, 0x100))
        {
            // Ошибка
            printf("Error listen %d\n", WSAGetLastError());
            closesocket(mysocket);
            WSACleanup();
            return -1;
        }
    
        printf("Ожидание подключений...\n");
    
        // Шаг 5 - извлекаем сообщение из очереди
        SOCKET client_socket; // сокет для клиента
        sockaddr_in client_addr; // адрес клиента (заполняется системой)
    
        // функции accept необходимо передать размер структуры
        int client_addr_size = sizeof(client_addr);
    
        // цикл извлечения запросов на подключение из очереди
        while ((client_socket = accept(mysocket, (sockaddr *)&client_addr, \
               &client_addr_size)))
        {
            nclients++; // увеличиваем счетчик подключившихся клиентов
    
            // пытаемся получить имя хоста
            HOSTENT *hst;
            hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);
    
            // вывод сведений о клиенте
            printf("+%s [%s] new connect!\n",
            (hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
            PRINTNUSERS
    
            // Вызов нового потока для обслужвания клиента
            // Да, для этого рекомендуется использовать _beginthreadex
            // но, поскольку никаких вызовов функций стандартной Си библиотеки
            // поток не делает, можно обойтись и CreateThread
            DWORD thID;
            CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
        }
        return 0;
    }
    
    // Эта функция создается в отдельном потоке
    // и обсуживает очередного подключившегося клиента независимо от остальных
    DWORD WINAPI SexToClient(LPVOID client_socket)
    {
        SOCKET my_sock;
        my_sock = ((SOCKET *)client_socket)[0];
        char buff[20 * 1024];
        #define sHELLO "Hello, Sailor\r\n"
    
        // отправляем клиенту приветствие
        send(my_sock, sHELLO, sizeof(sHELLO), 0);
    
        // цикл эхо-сервера: прием строки от клиента и возвращение ее клиенту
        int bytes_recv;
        while ((bytes_recv = recv(my_sock, &buff[0], sizeof(buff), 0)) &&
        bytes_recv != SOCKET_ERROR)
        send(my_sock, &buff[0], bytes_recv, 0);
    
        // если мы здесь, то произошел выход из цикла по причине
        // возращения функцией recv ошибки - соединение с клиентом разорвано
        nclients--; // уменьшаем счетчик активных клиентов
        printf("-disconnect\n"); PRINTNUSERS
    
        // закрываем сокет
        closesocket(my_sock);
        return 0;
    }
    
    КЛИЕНТ
    Code:
    // Пример простого TCP-клиента
    #include <stdio.h>
    #include <string.h>
    #include <winsock2.h>
    #include <windows.h>
    
    #define PORT 666
    #define SERVERADDR "127.0.0.1"
    
    int main(int argc, char* argv[])
    {
        char buff[1024];
        printf("TCP DEMO CLIENT\n");
    
        // Шаг 1 - инициализация библиотеки Winsock
        if (WSAStartup(0x202, (WSADATA *)&buff[0]))
        {
            printf("WSAStart error %d\n", WSAGetLastError());
            return -1;
        }
    
        // Шаг 2 - создание сокета
        SOCKET my_sock;
        my_sock = socket(AF_INET, SOCK_STREAM, 0);
        if (my_sock < 0)
        {
            printf("Socket() error %d\n", WSAGetLastError());
            return -1;
        }
    
        // Шаг 3 - установка соединения
        // заполнение структуры sockaddr_in - указание адреса и порта сервера
        sockaddr_in dest_addr;
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_port = htons(PORT);
        HOSTENT *hst;
    
        // преобразование IP адреса из символьного в сетевой формат
        if (inet_addr(SERVERADDR) != INADDR_NONE)
            dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
        else
        {
            // попытка получить IP адрес по доменному имени сервера
            if (hst = gethostbyname(SERVERADDR))
                // hst->h_addr_list содержит не массив адресов,
                // а массив указателей на адреса
                ((unsigned long *)&dest_addr.sin_addr)[0] =
                ((unsigned long **)hst->h_addr_list)[0][0];
            else
            {
                printf("Invalid address %s\n", SERVERADDR);
                closesocket(my_sock);
                WSACleanup();
                return -1;
            }
        }
    
        // адрес сервера получен - пытаемся установить соединение
        if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
        {
            printf("Connect error %d\n", WSAGetLastError());
            return -1;
        }
    
        printf("Соединение с %s успешно установлено\n \
                Type quit for quit\n\n", SERVERADDR);
    
        // Шаг 4 - чтение и передача сообщений
        int nsize;
        while ((nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0)) != SOCKET_ERROR)
        {
            // ставим завершающий ноль в конце строки
            buff[nsize] = 0;
    
            // выводим на экран
            printf("S=>C:%s", buff);
    
            // читаем пользовательский ввод с клавиатуры
            printf("S<=C:"); fgets(&buff[0], sizeof(buff) - 1, stdin);
    
            // проверка на "quit"
            if (!strcmp(&buff[0], "quit\n"))
            {
                // Корректный выход
                printf("Exit...");
                closesocket(my_sock);
                WSACleanup();
                return 0;
            }
    
            // передаем строку клиента серверу
            send(my_sock, &buff[0], strlen(&buff[0]), 0);
        }
        printf("Recv error %d\n", WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
    }
    
     
  6. _Alexandr_

    _Alexandr_ New Member

    Joined:
    6 May 2011
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    А какие нибудь дополнительные библиотеки и заголовочные файлы нужны? Вообще на чем компилировать? А то DevCpp что то там выругался.
     
  7. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    Visual Studio
     
  8. _Alexandr_

    _Alexandr_ New Member

    Joined:
    6 May 2011
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    Выдает ошибки....


    1>------ Построение начато: проект: client, Конфигурация: Debug Win32 ------
    1>Построение начато 05.05.2012 22:46:05.
    1>PrepareForBuild:
    1> Создание каталога "C:\Coding\client\Debug\".
    1>InitializeBuildStatus:
    1> Создание "Debug\client.unsuccessfulbuild", так как было задано "AlwaysCreate".
    1>ClCompile:
    1> client.cpp
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__send@16 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__recv@16 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__connect@12 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSACleanup@0 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__closesocket@4 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__gethostbyname@4 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__inet_addr@4 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__htons@4 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__socket@12 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSAGetLastError@0 в функции _main
    1>client.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__WSAStartup@8 в функции _main
    1>C:\Coding\client\Debug\client.exe : fatal error LNK1120: 11 неразрешенных внешних элементов
    1>
    1>СБОЙ построения.
    1>
    1>Затраченное время: 00:00:02.03
    ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
     
  9. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    LoadLibrary("ws2_32.dll");
     
  10. _Alexandr_

    _Alexandr_ New Member

    Joined:
    6 May 2011
    Messages:
    25
    Likes Received:
    0
    Reputations:
    0
    1>------ Построение начато: проект: client, Конфигурация: Debug Win32 ------
    1>Построение начато 05.05.2012 23:03:42.
    1>InitializeBuildStatus:
    1> Обращение к "Debug\client.unsuccessfulbuild".
    1>ClCompile:
    1> client.cpp
    1>c:\coding\client\client\client.cpp(6): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
    1>c:\coding\client\client\client.cpp(6): error C2365: LoadLibraryW: переопределение; предыдущим определением было "функция"
    1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winbase.h(7167): см. объявление "LoadLibraryW"
    1>c:\coding\client\client\client.cpp(6): error C2440: инициализация: невозможно преобразовать "const char [11]" в "int"
    1> Не существует контекста, в котором такое преобразование возможно
    1>
    1>СБОЙ построения.
    1>
    1>Затраченное время: 00:00:04.67
    ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
     
  11. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    LoadLibraryA("ws2_32.dll");
     
  12. cipa21

    cipa21 Elder - Старейшина

    Joined:
    9 Apr 2009
    Messages:
    548
    Likes Received:
    146
    Reputations:
    30
    #pragma comment(lib, "ws2_32.lib")