Модераторы: 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   Вверх
seravr
Дата 7.2.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(SVN74 @ 7.2.2009,  22: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

по-моему константа INADDR_LOOPBACK-это и есть 127.0.0.1

Добавлено через 1 минуту и 40 секунд
Ребята, а как быть с этими вопросами???

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

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

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

объектно-ориентированной моделью программирования 
PM MAIL   Вверх
seravr
Дата 7.2.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не помогло.

в чем же ошибка?
PM MAIL   Вверх
vinick
Дата 7.2.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 int sockfd; //<--
 if((sockfd=accept(sock,(struct sockaddr*)&addr,sizeof(addr)))<0) //<--
        puts("состояние ожидания");
    puts("запрос получен");
    int reccode=0;
    while((reccode=recv(sockfd,pbuff,sizeof(buff),0))>0) //<--
    {
        n+=reccode;
        printf("\n%d\n", reccode);
    }
   close(sockfd);



man 2 accept
И вобще у тебя получается что сервер читает данные независимо от того как завершился accept
PM MAIL ICQ Jabber   Вверх
seravr
Дата 7.2.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо Вам ОГРОМНОЕ, сейчас пойду пробовать.

а скажите пожалуйста что такое "man 2"?

Добавлено через 4 минуты и 8 секунд
Друзья, посоветуйте пожалуйста литературу, по которой Вы учились, мне очень охота программировать сокеты под вижал студию, а как и что там-я не знаю, изучаю все под LINUX? а очень охота под WINDOWS
PM MAIL   Вверх
SVN74
Дата 8.2.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(seravr @  7.2.2009,  23:45 Найти цитируемый пост)
Друзья, посоветуйте пожалуйста литературу, по которой Вы учились, мне очень охота программировать сокеты под вижал студию, а как и что там-я не знаю, изучаю все под LINUX? а очень охота под WINDOWS 


"Йон Снейдер Эффективное программирование TCP/IP"

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


Шустрый
*


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

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



Цитата(SVN74 @ 8.2.2009,  00:13)
[QUOTE"Йон Снейдер Эффективное программирование TCP/IP"


спасибо Вам, но там тоже ведь под Linux

Это сообщение отредактировал(а) seravr - 8.2.2009, 00:38
PM MAIL   Вверх
vinick
Дата 8.2.2009, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(seravr @  7.2.2009,  23:45 Найти цитируемый пост)
а скажите пожалуйста что такое "man 2"?

Это я по привычке написал smile В переводе на русский это оозначает "Смотри документацию на функцию accept"

Цитата(seravr @  8.2.2009,  00:29 Найти цитируемый пост)
Цитата(SVN74 @ 8.2.2009,  00:13)
[QUOTE"Йон Снейдер Эффективное программирование TCP/IP"


спасибо Вам, но там тоже ведь под Linux

Нет, автор старался, чтобы книга была полезна и программистам под Windows.
Так что ее можно смело читать.

Цитата(seravr @  7.2.2009,  22:29 Найти цитируемый пост)
еще хочу у Вас спросить, какие классы есть для работы с сокетами в майкрософт вижал студии 

Есть C++ библиотека asio. Не так давно она вошла в состав Boost, но ее можно использовать и отдельно. библиотека содержит только h-файлы и может работать с VC++ .
PM MAIL ICQ Jabber   Вверх
seravr
Дата 8.2.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



vinick и SVN74, спасибо Вам огромное, программа заработала после того как я изменил аргументы в функции accept(sock,(struct sockaddr*)&addr,sizeof(addr)), где второй и третий аргумент я заменил на NULL. прога сразу начала принимать вызов от клиента. С чем это связано- не пойму, не помогите разобраться пожалуйста.
И еще хочу спросить, когда я  в терминале запускаю сначала сервер ./server& а потом ./client, то сервер не откликается с первого раза на вызов клиента и никак не реагирует, а когда я опять вызываю ./client, то сервер нормально работает, вообщем сервер начинает отвечать только со второго вызова клиента, подскажите почему?
PM MAIL   Вверх
Олег2005
Дата 9.2.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Виндовс
12.    Оланд Д., Джонс Э. Программирование в сетях Microsoft Windows , ISBN: 5-318-00725-2 издательство "Питер", 2002 
28.    Jones A., Ohlund J., Ohlund Jim Network Programming for Microsoft Windows, Second Edition Microsoft Press, February 13, 2002 ISBN: 0735615799 

Вторая книга есть только на английском.
Русской версии не видел
PM MAIL WWW MSN   Вверх
MAKCim
Дата 9.2.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(seravr @  8.2.2009,  12:03 Найти цитируемый пост)
С чем это связано- не пойму, не помогите разобраться пожалуйста.

читать эу книгу
тут

цены в белорусских рублях, так что не пугайтесь

Добавлено через 57 секунд
Цитата(seravr @  8.2.2009,  12:03 Найти цитируемый пост)
подскажите почему? 

еще раз выложи сюда полный код приложения


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

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


Шустрый
*


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

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



Олег2005 и MAKCim, спасибо Вам огромное, сейчас буду читать.
Ребята, а никто не знает почему так:
...программа заработала после того как я изменил аргументы в функции accept(sock,(struct sockaddr*)&addr,sizeof(addr)), где второй и третий аргумент я заменил на NULL. прога сразу начала принимать вызов от клиента. С чем это связано- не пойму, не помогите разобраться пожалуйста.
И еще хочу спросить, когда я  в терминале запускаю сначала сервер ./server& а потом ./client, то сервер не откликается с первого раза на вызов клиента и никак не реагирует, а когда я опять вызываю ./client, то сервер нормально работает, вообщем сервер начинает отвечать только со второго вызова клиента, подскажите почему?
PM MAIL   Вверх
MAKCim
Дата 9.2.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



seravr, 
Цитата(MAKCim @  9.2.2009,  09:28 Найти цитируемый пост)
еще раз выложи сюда полный код приложения 




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

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


Шустрый
*


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

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



Код

-------------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("сервер переведен в пассивный режим");
    int newSocket=0;
    while(1)
    {
        if((newSocket=accept(sock,0,0))<0)
            puts("состояние ожидания");
        else 
        {
            puts("запрос получен");
            int reccode=0;
            while((reccode=recv(sock,pbuff,sizeof(buff),0))>0)
            {
                n+=reccode;
            }
        
            buff[n]='\0';
            if(reccode<0)
                perror("socket:");
            puts(pbuff);//выводим принятую строку
            close(newSocket);
        }
    }
    close(sock);
    return 0;
}

PM MAIL   Вверх
vinick
Дата 9.2.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

  while((reccode=recv(newSocket,pbuff,sizeof(buff),0))>0) //!!!!!


и анализируй errno в случае ошибок. полезно.
PM MAIL ICQ Jabber   Вверх
seravr
Дата 9.2.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Шустрый
*


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

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



Друзья, возникли еще вопросы, которые я не до конца понимаю, помогите понять пожалуйста
1) что такое поток и процесс??? понял, что в процессе может быть несколько потоков или один поток
2)как обойти блокировку сокетов при использовании функций send() и recv()

Буду рад любому ответу
PM MAIL   Вверх
xvr
Дата 12.2.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(seravr @ 12.2.2009,  11:56)
Друзья, возникли еще вопросы, которые я не до конца понимаю, помогите понять пожалуйста
1) что такое поток и процесс??? понял, что в процессе может быть несколько потоков или один поток

Да. Процесс - это твоя исполняемая программа. У каждого процесса своя память и они друг с другом никак не пересекаются. Все процессы в системе исполняются одновременно (или спят по очереди  smile ).
Поток создается внутри процесса, все потоки работают в общей памяти процесса, все они исполняются одновременно (или спят).

Цитата

2)как обойти блокировку сокетов при использовании функций send() и recv()
Перевести сокет в неблокирующий режим. См. функцию fcntl и константу O_NONBLOCK (еще смотри poll и select)


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


Шустрый
*


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

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



xvr, спасибо большое
PM MAIL   Вверх
MAKCim
Дата 13.2.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(xvr @  12.2.2009,  12:47 Найти цитируемый пост)
Да. Процесс - это твоя исполняемая программа

нет

Цитата(xvr @  12.2.2009,  12:47 Найти цитируемый пост)
Поток создается внутри процесса

нет

не забывай, в каком мы разделе  smile 


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

PM MAIL   Вверх
xvr
Дата 13.2.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @ 13.2.2009,  09:50)
Цитата(xvr @  12.2.2009,  12:47 Найти цитируемый пост)
Да. Процесс - это твоя исполняемая программа

нет

Цитата(xvr @  12.2.2009,  12:47 Найти цитируемый пост)
Поток создается внутри процесса

нет

не забывай, в каком мы разделе  smile

Я помню, но IMHO, человеку, который спрашивает что такое процесс и поток, рассказывать о особенностях реализации того и другого в Linux будет черезчур жестоко  smile 
2 seravr - можешь считать, что процесс о поток это именно то, что я написал. 
Если интересует реальная их реализация в Linux'е, то она немного другая. Но к тому времени, когда тебе смогут понадобится детали реальной реализации, у тебя таких вопросов (про отличия потока и процесса) уже не останется  smile 

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


Шустрый
*


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

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



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

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

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


 




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


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

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