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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несколько вопросов по программированию TCP/IP 
:(
    Опции темы
seravr
Дата 31.1.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет, я начал изучать TCP/IP, API сокетов под Linux. Есть несколько вопросов, помогите понять пожалуйста.
1)Как можно отлаживать программы типа клиент/сервер на одном компьютере(дома нет локалки)

2)никак не могу понять как должна работать любая игра(даже самая простая), которая предусматривает игру по локалки или по нету, т.е. не могу понять схему клиент/сервер игры, какое приложение должно быть сервером, а какое - клиентом, т.е. как подобная программа взаимодействует

3)для программирования приложений типа клиент-сервер достаточно ли знать интерфейс сокетов и протокол TCP/IP, что можно еще посоветовать для более глубокого изучения сетей

4)где можно взять source по программированию сокетов(типа аська) для Linux, поделитесь советами кто по каким примерам учился

Буду рад любому ответу, всем заранее спасибо

Это сообщение отредактировал(а) seravr - 31.1.2009, 14:11
PM MAIL   Вверх
MAKCim
Дата 31.1.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(seravr @  31.1.2009,  14:07 Найти цитируемый пост)
Как можно отлаживать программы типа клиент/сервер на одном компьютере(дома нет локалки)

использовать loopback интерфейс
loopback

Цитата(seravr @  31.1.2009,  14:07 Найти цитируемый пост)
никак не могу понять как должна работать любая игра(даже самая простая), которая предусматривает игру по локалки или по нету, т.е. не могу понять схему клиент/сервер игры, какое приложение должно быть сервером, а какое - клиентом, т.е. как подобная программа взаимодействует

сервер обеспечивает взаимодействие клиентов и соответствующий протокол

Цитата(seravr @  31.1.2009,  14:07 Найти цитируемый пост)
для программирования приложений типа клиент-сервер достаточно ли знать интерфейс сокетов и протокол TCP/IP, что можно еще посоветовать для более глубокого изучения сетей

1. протокола TCP/IP нет, есть отдельно протоколы TCP, IP
2. для неспециализированных клиент-серверных приложений нет необходмости в _глубоком_ знании TCP и IP

Цитата(seravr @  31.1.2009,  14:07 Найти цитируемый пост)
где можно взять source по программированию сокетов(типа аська) для Linux, поделитесь советами кто по каким примерам учился

читать У. Стивенса


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
seravr
Дата 31.1.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, а как этот loopback интерфейс использовать подскажите пожалуйста.
и еще по поводу игры, т.е. сама игра-это сервер, а те кто играют, т.е. используют программу клиент, и взаимодействие происходит между клиентами посредством сервера,  а сам сервер должен где либо установлен в сети и постоянно функционировать, правильно ли я понял?
PM MAIL   Вверх
MAKCim
Дата 31.1.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(seravr @  31.1.2009,  17:02 Найти цитируемый пост)
правильно ли я понял? 

да


Цитата(seravr @  31.1.2009,  17:02 Найти цитируемый пост)
а как этот loopback интерфейс использовать подскажите пожалуйста.

точно так же как и другие

socket()->connect(127.x.y.z:port) на клиенте
socket()->bind(127.x.y.z:port)->listen()->accept() на сервере




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Шустрый
*


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

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



MAKCim, спасибо Вам огромное
PM MAIL   Вверх
seravr
Дата 1.2.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



извините за надоедливость, хочу спросить, в linuxe клиента и сервера надо запускать в разных терминалах?
PM MAIL   Вверх
cutwater
Дата 1.2.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не обязятельно... если правильно понял вопрос, если хотите чтобы в одном необходимо первый процессу сделать fork

в bash например
Код

[user@host]$ process &


Добавлено через 3 минуты и 47 секунд
The Bash & (ampersand) is a builtin control operator used to fork processes. From the Bash man page, "If a command is terminated by the control operator &, the shell executes the command in the background in a subshell".

Добавлено через 4 минуты и 42 секунды
То есть после написания комманды необходимо добавит амперсанд  (&)


--------------------
user posted image
PM MAIL   Вверх
seravr
Дата 1.2.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ничего не понял, можно поподробнее пожалуйста, функция fork() по-моему создает еще один процесс, подобный первому.
я имел ввиду, когда я компилирую отдельно приложение клиента и приложение сервера, и хочу их запустить в одном окне терминала, дело в том, что я запускаю сервер, а он будет ждать приема и из этого терминала я не смогу запустить клиента, получается только из разных терминалов запускать. можно ли как сделать, чтоб в одном окне работать и с серверным приложением, и с клиентским
PM MAIL   Вверх
cutwater
Дата 1.2.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если Вы имени приложения ставите & то bash делает fork и запускает приложение ваше в фоновом режиме
в итоге Вы можете запустить как клиент так и сервер

jobs - показать фоновые процессы текущего терминала


--------------------
user posted image
PM MAIL   Вверх
seravr
Дата 1.2.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо огромное
PM MAIL   Вверх
seravr
Дата 7.2.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Друзья, подскажите пожалуйста почему не работает сервер(точнее работает), функция 
recv(sock,pbuff,sizeof(buff),0) возвращает -1, т.е. не принимает сообщение, хотя клиент 

нормально отправляет сообщение.(система: linux open suse)
Подскажите пожалуйста в чем ошибка???

и еще хочу у Вас спросить, какие классы есть для работы с сокетами в майкрософт вижал студии 

2008, что посоветуете почитать про программирование сокетов под виндовс(подскажите хорошую 

книжку), какие там используются функции и как программирование сокетов организовать с 

объектно-ориентированной моделью программирования  

Код

-------------client------------
#include<stdio.h>
#include<string.h>
#include<sys/types>
#include<sys/socket>
#include<netinet/in.h>

int main()
{
    char buff[]="send";
    char* pbuff=buff;

    int sock=0;
    struct sockaddr_in addr;
    sock=socket(PF_INET,SOCK_STREAM,0);
    if(sock<0)
        puts("сокет не создан");
    else 
        puts("сокет создан");
    addr.sin_family=AF_INET;
    addr.sin_port=htons(3425);
    addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
    if((connect(sock,(struct sockaddr*)&addr,sizeof(addr)))<0)
        puts("ошибка подключения к серверу");
    else
        puts("подключились к серверу");
    if((send(sock,pbuff,sizeof(buff),0))<0)
        puts("ошибка отправки сообщения");
    else 
        puts("сообщение серверу отправлено");

    close(sock);
    return 0;
}


Код

------------server-------------
#include<stdio.h>
#include<string.h>
#include<sys/types>
#include<sys/socket>
#include<netinet/in.h>

int main()
{
    char buff[100];
    char* pbuff=buff;

    int sock=0,n=0;
    struct sockaddr_in addr;
    sock=socket(PF_INET,SOCK_STREAM,0);
    if(sock<0)
        puts("сокет не создан");
    else 
        puts("сокет создан");
    addr.sin_family=AF_INET;
    addr.sin_port=htons(3425);
    addr.sin_addr.s_addr=htonl(INADDR_ANY);

    if((bind(sock,(struct sockaddr*)&addr,sizeof(addr)))<0)
    {
        puts("функция bind() не сработала");
        exit(1);
    }
    if((listen(sock,5))<0)
    {
        puts("функция listen() не сработала");
        exit(2);
    }
    else
        puts("сервер переведен в пассивный режим");
    if((accept(sock,(struct sockaddr*)&addr,sizeof(addr)))<0)
        puts("состояние ожидания");
    puts("запрос получен");
    int reccode=0;
    while((reccode=recv(sock,pbuff,sizeof(buff),0))>0)
    {
        n+=reccode;
        printf("\n%d\n", reccode);
    }
    printf("\n%d\n", reccode);
    buff[n]='\0';
    if(reccode<0)
        perror("socket:");
    puts(pbuff);//выводим принятую строку
    close(sock);
    return 0;
}

PM MAIL   Вверх
SVN74
Дата 7.2.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если сервер получил сокет, значит остальное проще...
Попробуй   заменить на   recv(sock,&buff[0],sizeof(buff),0)
PM MAIL WWW   Вверх
seravr
Дата 7.2.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо, сейчас попробую, а то я уже чего только не перепробовал, отпишусь минут через 10
PM MAIL   Вверх
seravr
Дата 7.2.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нет, не помогло, все равно тоже самое, в сервере функция recv(sock,pbuff,sizeof(buff),0) возвращает -1, а функция perror() выводит что то типа: TRANSPORT ENDPOINT IS NOT CONNECTED

товарищи, помогите плиз разобраться с этой ошибкой
PM MAIL   Вверх
SVN74
Дата 7.2.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй еще так:
while((reccode=recv(sock,pbuff,sizeof(buff),0)) && reccode !=SOCKET_ERROR)
В клиенте тоже надо заменить на send(sock,&buff[0],sizeof(buff),0)
ОООО . 
А как он у тебя коннетится??? (addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK) - > надо указать реальный адрес 127.0.0.1
s_addr=inet_addr(SVR_IP);

Это сообщение отредактировал(а) SVN74 - 7.2.2009, 22:50
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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