использование socket'ов в C++

Модератор: Модераторы разделов

Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

использование socket'ов в C++

Сообщение 0xFF »

Задача - сервер. Реализация на C++ с использованием сокетов.
Нужна инфа по программированию сокетов. Сам добрался только до схемы сервер<->клиент, а надо сервер<->много клиентов.

Возрадуюсь любым линкам, относящимся к теме.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: использование socket'ов в C++

Сообщение KiWi »

Ищите по pthread, fork
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: использование socket'ов в C++

Сообщение diesel »

0xFF писал(а):
30.06.2006 21:38
Задача - сервер. Реализация на C++ с использованием сокетов.
Нужна инфа по программированию сокетов. Сам добрался только до схемы сервер<->клиент, а надо сервер<->много клиентов.

Возрадуюсь любым линкам, относящимся к теме.

http://hub.ru/modules.php?name=Downloads&d...download&cid=22 - Андрей Робачевский - ОС UNIX - есть даже работающий пример. А вообще гугл ... примеров должно быть достаточно.
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: использование socket'ов в C++

Сообщение fatboy »

0xFF писал(а):
30.06.2006 21:38
Задача - сервер. Реализация на C++ с использованием сокетов.
Нужна инфа по программированию сокетов. Сам добрался только до схемы сервер<->клиент, а надо сервер<->много клиентов.

Возрадуюсь любым линкам, относящимся к теме.


на этом ресурсе в литературном разделе видел книгу о программировании сетевых приложений в UNIX.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

diesel писал(а):
30.06.2006 22:10
0xFF писал(а):
30.06.2006 21:38

Задача - сервер. Реализация на C++ с использованием сокетов.
Нужна инфа по программированию сокетов. Сам добрался только до схемы сервер<->клиент, а надо сервер<->много клиентов.

Возрадуюсь любым линкам, относящимся к теме.

http://hub.ru/modules.php?name=Downloads&d...download&cid=22 - Андрей Робачевский - ОС UNIX - есть даже работающий пример. А вообще гугл ... примеров должно быть достаточно.

Прямо в яблочко,
РесПекТ
Спасибо сказали:
Аватара пользователя
Ardzhan
Сообщения: 57
ОС: Debian + WinXP на виртуалке

Re: использование socket'ов в C++

Сообщение Ardzhan »

Юзай select();
Пример использования сокетов можно найти на http://beej.us/guide/bgnet/
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

Ardzhan писал(а):
02.07.2006 17:33
Юзай select();
Пример использования сокетов можно найти на http://beej.us/guide/bgnet/

хм... сильно. Как я понял, ресурс в теории динамически развивающийся, тпа LFS, только из-за недостатка финансовой мотивации последний раз обновлялся давно...
Спасибо
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: использование socket'ов в C++

Сообщение diesel »

Вот еще, по вашему вопросу про соккеты:

http://linuxcenter.ru/lib/books/qt3/qt3_17...KINGWITHQSOCKET
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: использование socket'ов в C++

Сообщение nerezus »

http://nerezus.narod.ru/books/tcpip.rar
446kb

Правда тут имеется ввиду C, а не C++. Но общие принципы вроде те же =)
ICQ 547097
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

nerezus писал(а):
04.07.2006 10:27
http://nerezus.narod.ru/books/tcpip.rar
446kb

Правда тут имеется ввиду C, а не C++. Но общие принципы вроде те же =)


...неплохо... но не то что надо






перелохматив всю оговоренную выше инфу, начал писать сервер. Больше всего пользы наблюдалось от ресурса http://beej.us/guide/bgnet/. Там есть понятный пример - мультиплексный сервер на примере чата, который можно использовать в качестве каркаса масштабируемого сервера. Мультиклиентность реализована select()'ом.
.....конечно не идеал производительности... чтож будем полировать по мере надобности..

... И ОТДЕЛЬНОЕ ОГРОМНОЕ СПАСИБО diesel'у за отличные книги в электронном виде.
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

привет,

что-то мне ник твой такой знакомый =)

могу подкинуть пару идей относительно твоей проблемы, можешь почитать сам в исходниках небезызвестной программы hydranode - ибо там сделано на c++, и действительно качественно.

основная идея - использовать select/poll
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

0xFF писал(а):
06.07.2006 10:23
Мультиклиентность реализована select()'ом. .....конечно не идеал производительности...


куда уж производительней то? быстрее системного вызова ничего работать не будет.
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

форкаться немного медленнее, чем юзать селект, но гораздо проще для начинающих...
слава роботам!
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

elide писал(а):
13.07.2006 14:39
форкаться немного медленнее, чем юзать селект, но гораздо проще для начинающих...


форкаться -- это не значит сервер<->много клиентов, поэтому такое предложение вообще не подходит в качестве решения.
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: использование socket'ов в C++

Сообщение d_Sun »

agbr писал(а):
13.07.2006 16:06
форкаться -- это не значит сервер<->много клиентов, поэтому такое предложение вообще не подходит в качестве решения.


Это еще почему?
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

agbr писал(а):
13.07.2006 14:03
привет,

что-то мне ник твой такой знакомый =)


привет...
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

agbr писал(а):
13.07.2006 14:35
0xFF писал(а):
06.07.2006 10:23

Мультиклиентность реализована select()'ом. .....конечно не идеал производительности...


куда уж производительней то? быстрее системного вызова ничего работать не будет.


Видел пример асинхронного сервера под .NET. В статье писалось, что он оптимальнее многопоточного и select()'ового.... но Господи упаси меня что-нить серьёзное писать под !@#$%^&*
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

простите, а что есть «асинхронный сервер» и чем он отличается от использования select ?
слава роботам!
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

d_Sun писал(а):
13.07.2006 16:19
agbr писал(а):
13.07.2006 16:06

форкаться -- это не значит сервер<->много клиентов, поэтому такое предложение вообще не подходит в качестве решения.


Это еще почему?


fork создает КОПИЮ текущего процесса, это значит, что каждым клтиентом занимается отдельный процесс, и работать вместе они естественно не могут, т.е. тут реализуется ситуация сервер<->клиент


0xFF писал(а):
13.07.2006 17:23
Видел пример асинхронного сервера под .NET. В статье писалось, что он оптимальнее многопоточного и select()'ового.... но Господи упаси меня что-нить серьёзное писать под !@#$%^&*


В вендах?
В POSIX ты лучше select ничего не найдешь, ибо это труъ, надо только правельно с ним работать, чтобы в while(1) не вошел =)
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

работать вместе они естественно не могут
а про IPC Вам в детском садике не рассказывали, да?
слава роботам!
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

elide писал(а):
13.07.2006 21:08
работать вместе они естественно не могут
а про IPC Вам в детском садике не рассказывали, да?


Ну, раз такой умный, то изобрази, так чтобы каждый клиент, который подключается получал список ip-адресов других клиентов.
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: использование socket'ов в C++

Сообщение d_Sun »

agbr писал(а):
14.07.2006 11:56
elide писал(а):
13.07.2006 21:08

работать вместе они естественно не могут
а про IPC Вам в детском садике не рассказывали, да?


Ну, раз такой умный, то изобрази, так чтобы каждый клиент, который подключается получал список ip-адресов других клиентов.


Вы бы лучше не пороли чушь тут, а почитали бы книги:

У.Р. Стивенс "Разработка сетевых приложений"
У.Р. Стивенс "Взаимодействие процессов"


elide писал(а):
13.07.2006 17:38
простите, а что есть «асинхронный сервер» и чем он отличается от использования select ?


Имеется в виду неблокируемый В/В в сокеты. Ну я так подозреваю по крайней мере :)

agbr писал(а):
13.07.2006 19:40
fork создает КОПИЮ текущего процесса,


:D Просветил. Спасибо :D :D :D
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

d_Sun
Имеется в виду неблокируемый В/В в сокеты
вот я и спрашиваю, а чем это отличается от select, который обеспечивает тот же самый неблокирыемый вв? я так понял, что под виндой просто select нету, поэтому они опять придумали велосипед на квадратных колесах, а теперь пытаются всех убедить, что он едет быстрее, чем на круглых......

agbr
если ты изобразишь эту фигню с использованием потоков или select, то я потом переделаю ее под форк.
а писать с нуля - нах. мне жаль тратить свое время на дураков.
слава роботам!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: использование socket'ов в C++

Сообщение d_Sun »

elide писал(а):
14.07.2006 14:27
вот я и спрашиваю, а чем это отличается от select, который обеспечивает тот же самый неблокирыемый вв? я так понял, что под виндой просто select нету, поэтому они опять придумали велосипед на квадратных колесах, а теперь пытаются всех убедить, что он едет быстрее, чем на круглых......


Есть в винде select! Сорри ошибся я...

The select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: использование socket'ов в C++

Сообщение 0xFF »

(d_Sun @ Jul 14 2006, в 18:13) писал(а):Вы бы лучше не пороли чушь тут, а почитали бы книги:

У.Р. Стивенс "Разработка сетевых приложений"
У.Р. Стивенс "Взаимодействие процессов"


Если есть в нете, можно ссылочку?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: использование socket'ов в C++

Сообщение diesel »

0xFF писал(а):
14.07.2006 21:35
(d_Sun @ Jul 14 2006, в 18:13) писал(а):
Вы бы лучше не пороли чушь тут, а почитали бы книги:

У.Р. Стивенс "Разработка сетевых приложений"
У.Р. Стивенс "Взаимодействие процессов"


Если есть в нете, можно ссылочку?


я нашел англоязычные, но там две книги порядка 100 метров каждая:(
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

для начала, http://rapidshare.de/files/835571/Stivens_...zeniy.djvu.html
взаимодействие процессов точно было, но за первые 30 секунд не нашлось, а тратить больше 30 секунд на помощь человеку, которому лень самостоятельно погуглить, я не собираюсь.
слава роботам!
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: использование socket'ов в C++

Сообщение fatboy »

fatboy писал(а):
01.07.2006 06:18
на этом ресурсе в литературном разделе видел книгу о программировании сетевых приложений в UNIX.


IPC & Network Programming (.pdf)
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: использование socket'ов в C++

Сообщение agbr »

elide писал(а):
14.07.2006 14:27
agbr
если ты изобразишь эту фигню с использованием потоков или select, то я потом переделаю ее под форк.
а писать с нуля - нах. мне жаль тратить свое время на дураков.


а у меня нет времени, чтобы доказывать дуракам, что они дураки.

откомпилируй, и запусти это:

Код: Выделить всё

#include <sys/types.h>
#include <unistd.h>

#include <iostream>

int i=0;

void funct(int pid){
    for(int j=0;j<10;j++){
        std::cout << pid << "=pid; i=" << i++ << std::endl;
    }
}

int main(){

    pid_t pid=fork();
    funct(pid);

    return 0;
}


и посмотри, чем отличается от этого

Код: Выделить всё

#include <sys/types.h>
#include <unistd.h>

#include <iostream>

int i=0;

void funct(int pid){
    for(int j=0;j<10;j++){
        std::cout << pid << "=pid; i=" << i++ << std::endl;
    }
}

int main(){

    pid_t pid=0;
    funct(pid);
    funct(pid);

    return 0;
}
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: использование socket'ов в C++

Сообщение elide »

я и без компиляции могу понять чем отличаются эти два куска. только какое это имеет отношение к
каждым клтиентом занимается отдельный процесс, и работать вместе они естественно не могут
помедитируй над этим фрагментом, а уже потом рассказывай про то, что "работать вместе они естественно не могут"...

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>

const int thr = 12;
int prc_num = 4;
int *counter = 0;

void init(void){
    int h = shmget(IPC_PRIVATE, 1024, 0600);
    counter = (int*)shmat(h, 0, 0);
    shmctl(h, IPC_RMID, NULL);
}

void run(void){
    if(fork())return;
    while(*counter < thr){
        printf("child process pid: %d; counter: %d\n", getpid(), (*counter)++);
        sleep(1);
    }
    exit(0);
}

int main(){
    init();
    printf("main process pid: %d\n", getpid());
    while(prc_num--) run();
    while(*counter < thr);
    printf("main process pid: %d: exit\n", getpid());
    return 0;
}

тебе уже давали полезный совет. почитай про IPC, а после этого уже пытайся казаться умным. и все-таки с клиентами и ip-адресами напиши код, ага.
слава роботам!
Спасибо сказали: