Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с сокетами, Как слушать порт в программе и отвечать паралельно на запросы

8.5K
16 мая 2005 года
koo
11 / / 31.03.2005
Кто может посоветовать как реализовать прослушку порта, и при поступлении на него запросов от клиентов, отправлять им некоторые данные. Есть ли подводный камень при поступлении сразу нескольких запросос одновременно - их нада обслуживать все сразу - паралельно (желательно).

Хочу организовать свой прокси сервер.
3.3K
17 мая 2005 года
GENA_DJ
123 / / 08.03.2005
Цитата:
Originally posted by koo
Кто может посоветовать как реализовать прослушку порта, и при поступлении на него запросов от клиентов, отправлять им некоторые данные. Есть ли подводный камень при поступлении сразу нескольких запросос одновременно - их нада обслуживать все сразу - паралельно (желательно).

Хочу организовать свой прокси сервер.



Под Виду пишешь?? TCP или UDP??
Если под Винду и TCP, то можно сделать примерно так:

SOCKET
listensocket,//слушающий сокет
s;//индивидуальный сокет клиента

struct sockaddr_in
saddr,//адрес слушающего
saddr_c;//адрес клиента

int
slen;

listensocket=socket(AF_INET,SOCK_STREAM,0);

saddr.sin_family = AF_INET ;//протокол tcp/ip
saddr.sin_addr .s_addr = INADDR_ANY ;//здесь можно уразать конкретный сетевой интерфейс
saddr.sin_port = htons(SERV_PORT);//порт

bind(listensocket,(LPSOCKADDR)&saddr,sizeof(saddr));//привязка сокета к адресу

listen(listensocket,SOMAXCONN);//слушаем сокет на предмет подключения

for(;;)//ждем клиентов
{
s=accept(listensocket,(struct sockaddr FAR*)&saddr_c,&slen);
if(s<=0)
break;
//далее все зависит от твоей фантазии, я создал для каждого клиента свой поток, где были и send(), и recv(), и select()
hThreadDo=CreateThread(NULL,0,ThreadDo,(LPVOID)s,0,&dwThreadDoId);
}
Есть еще механизм неблокирующих сокетов с виндовыми сообщениями, но серваки, по - моему, лучше писать без них.

С UDP ситуация еще проще, можно посмотреть у Фролова, том 23, "Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows Sockets"

8.5K
17 мая 2005 года
koo
11 / / 31.03.2005
Цитата:
Originally posted by GENA_DJ
Под Виду пишешь?? TCP или UDP??
Если под Винду и TCP, то можно сделать примерно так:

SOCKET
listensocket,//слушающий сокет
s;//индивидуальный сокет клиента

struct sockaddr_in
saddr,//адрес слушающего
saddr_c;//адрес клиента

int
slen;

listensocket=socket(AF_INET,SOCK_STREAM,0);

saddr.sin_family = AF_INET ;//протокол tcp/ip
saddr.sin_addr .s_addr = INADDR_ANY ;//здесь можно уразать конкретный сетевой интерфейс
saddr.sin_port = htons(SERV_PORT);//порт

bind(listensocket,(LPSOCKADDR)&saddr,sizeof(saddr));//привязка сокета к адресу

listen(listensocket,SOMAXCONN);//слушаем сокет на предмет подключения

for(;;)//ждем клиентов
{
s=accept(listensocket,(struct sockaddr FAR*)&saddr_c,&slen);
if(s<=0)
break;
//далее все зависит от твоей фантазии, я создал для каждого клиента свой поток, где были и send(), и recv(), и select()
hThreadDo=CreateThread(NULL,0,ThreadDo,(LPVOID)s,0,&dwThreadDoId);
}



А можно поподробнее про потоки и как с ними работать?

3.3K
26 мая 2005 года
GENA_DJ
123 / / 08.03.2005
Цитата:
Originally posted by koo
А можно поподробнее про потоки и как с ними работать?


Посмотри у Рихтера
http://www.proglib.ru/detail_book.asp?id=190

59K
24 марта 2010 года
liopard
1 / / 24.03.2010
Цитата: GENA_DJ


SOCKET
listensocket,//слушающий сокет
s;//индивидуальный сокет клиента

struct sockaddr_in
saddr,//адрес слушающего
saddr_c;//адрес клиента

int
slen;

listensocket=socket(AF_INET,SOCK_STREAM,0);

saddr.sin_family = AF_INET ;//протокол tcp/ip
saddr.sin_addr .s_addr = INADDR_ANY ;//здесь можно уразать конкретный сетевой интерфейс
saddr.sin_port = htons(SERV_PORT);//порт

bind(listensocket,(LPSOCKADDR)&saddr,sizeof(saddr));//привязка сокета к адресу

listen(listensocket,SOMAXCONN);//слушаем сокет на предмет подключения

for(;;)//ждем клиентов
{
s=accept(listensocket,(struct sockaddr FAR*)&saddr_c,&slen);
if(s<=0)
break;
//далее все зависит от твоей фантазии, я создал для каждого клиента свой поток, где были и send(), и recv(), и select()
hThreadDo=CreateThread(NULL,0,ThreadDo,(LPVOID)s,0,&dwThreadDoId);
}



сделал все так как в примере.
Но почему-то, несмотря на использование потока, accept не срабатывает пока предыдущий сокет s не закроется.

ничо не понимаю...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог