Работа с сокетами, Как слушать порт в программе и отвечать паралельно на запросы
Хочу организовать свой прокси сервер.
Кто может посоветовать как реализовать прослушку порта, и при поступлении на него запросов от клиентов, отправлять им некоторые данные. Есть ли подводный камень при поступлении сразу нескольких запросос одновременно - их нада обслуживать все сразу - паралельно (желательно).
Хочу организовать свой прокси сервер.
Под Виду пишешь?? 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"
Под Виду пишешь?? 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);
}
А можно поподробнее про потоки и как с ними работать?
А можно поподробнее про потоки и как с ними работать?
Посмотри у Рихтера
http://www.proglib.ru/detail_book.asp?id=190
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 не закроется.
ничо не понимаю...