Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с примером клиент-сервер, Основы сетевого программирования 
:(
    Опции темы
Bugmaker
Дата 3.11.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Здравствуйте товарищи.
Пытаюсь компилировать пример отсюда http://www.insidepro.com/kk/006/006r.shtml

Код

// Пример простого 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;
}


Компилятор выдает кучу ошибок.
Пробовал добавить вначале #pragma comment (lib, "ws2_32.lib");
Не помогает.
Наставьте на путь истинный, да и вообще дайте ссылок где прочитать более доступно про сокеты. Наиболее интересно ьыло бы узнать о реализиции многопользовательских систем.
Среда разраблтки Dev-C++

Ошибки такого вида:
  [Linker error] undefined reference to `WSAStartup@8' 
Чуть ли не на кажду строку кода.


И еще глупый вопрос.
Код из другого примера:
Код

WORD wVersion;
WSADATA wsaData;
wVersion = MAKEWORD (2, 0); 
SOCKET sd;



WORD, WSADATA, wVersion это типы данных?? Извиняюсь, голова уже не варит к вечеру.
PM MAIL   Вверх
mes
Дата 3.11.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Bugmaker @  3.11.2010,  16:39 Найти цитируемый пост)
WORD, WSADATA, wVersion это типы данных??

первые два типы, а третье данные.. 

Цитата(Bugmaker @  3.11.2010,  16:39 Найти цитируемый пост)
  [Linker error] undefined reference to `WSAStartup@8' 

не подключена библиотека. 

Цитата(Bugmaker @  3.11.2010,  16:39 Найти цитируемый пост)
#pragma comment (lib, "ws2_32.lib");

Цитата(Bugmaker @  3.11.2010,  16:39 Найти цитируемый пост)
Среда разраблтки Dev-C++

#pragma comment - это только для VS.. ищите в свойствах проекта, как подключать библиотеки.. 






--------------------
PM MAIL WWW   Вверх
Bugmaker
Дата 3.11.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Спасибо.
wVersion по невнимательности в список добавил)

А может кто ws2_32.lib залить куда-нить? Буду очень признателен.

PM MAIL   Вверх
Bugmaker
Дата 4.11.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Скачал библиотеку, разобрался как добавить ее в проект.
Спасибо!


Дайте ссылку где поподробнее можно прочитать про потоки и функции работы с ними. А то что-то в голове нет четкого представления о том что они есть такое. Или может кто-то сам может доступным языком объяснить.



Это сообщение отредактировал(а) Bugmaker - 4.11.2010, 17:06
PM MAIL   Вверх
Bugmaker
Дата 4.11.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



  Circular client <- client.o dependency dropped. 
Кто с такой ошибкой сталкивался? подскажите, чем может быть вызвана.
PM MAIL   Вверх
Bugmaker
Дата 5.11.2010, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Не хочется создавать новую тему.
Может кто-нибудь подскажет. Есть какие-то пути легкой реализации удаленнйо командной строки windows? может какие-то стандартные команды... клиент-сервер постиг. хотелось бы практическое применение получить а не просто чат smile
PM MAIL   Вверх
xvr
Дата 8.11.2010, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Bugmaker @ 4.11.2010,  19:31)
Circular client <- client.o dependency dropped. 
Кто с такой ошибкой сталкивался? подскажите, чем может быть вызвана.

Ошибкой в makefile'е. У вас там прописана зависимость client от client.o и наоборот.

Добавлено через 1 минуту и 22 секунды
Цитата(Bugmaker @  5.11.2010,  17:50 Найти цитируемый пост)
 Есть какие-то пути легкой реализации удаленнйо командной строки windows? может какие-то стандартные команды... 
Есть. telnet например (на сервере должен быть запущен telnetd сервис)
Еще WMI позволяет запускать проги удаленно
Из сторонних программ есть OpenSSH (с сорцами)


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.