WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  server socket

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   server socket
DEiL опубликован 13-09-2001 15:16 MSK   Click Here to See the Profile for DEiL   Click Here to Email DEiL  
люди, памагити 8)
короче, мне нужно написать приложение, наподобин ирц сервера, но на чистом api, и когда я пишу s1=accept(...) иил recv(...), то моя программа ЖДЁТ, пока кто-нибудь не законнектится \ не пошлёт информацию. а ведь это сервер и таких клиентов много и получается билиберда. как это исправить? :)
зы. я точно знаю что нужно юзать setsockopt ;)
purpe опубликован 13-09-2001 15:27 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
тебе нада ваять многопотоковый сервер. одним setsockopt не отделаешься ...
Для начала надо научить твой сервер обрабатывать сообщения от сокета типа FD_ACCEPT, FD_READ и т.д. , а вместо setsockopt лучше воспользоваться WSAAsyncSelect.
purpe опубликован 13-09-2001 15:34 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
то что я сказал находится в http://www.sources.ru/download/Diasrv32.zip
это простейший UDP сервер на чистом апи. Но он не многопотоковый, и одновременно (если его переделывать на TCP) не сможет обрабатывать запросы пользователей.

глянь исходники Apache, но такое количество исходного кода скорее всего приведёт тебя в уныние :)

DEiL опубликован 13-09-2001 16:27 MSK     Click Here to See the Profile for DEiL  Click Here to Email DEiL     
purpe -> в том то всё и дело, что мне не надо обрабатывать эти сообщения и прочую лабуду -)
мне нужно консольное приложение с возможностью с минимальными переделками запустить под *nix. вот в чём дело -)
DEiL опубликован 13-09-2001 17:15 MSK     Click Here to See the Profile for DEiL  Click Here to Email DEiL     
If the socket is marked nonblocking and no pending connections are present on the queue, accept returns the WSAEWOULDBLOCK error value !!
но КАК пометить сокет как nonblocking? ;)
purpe опубликован 13-09-2001 18:04 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
с минимальными не получится!
я правда не в курсе, как в консольном приложении отлавливать сообщения от сокета. обычно я это делаю через окошки :)

Но если хочешь, чтобы работало одновременно и в линуксе и в винде и при этом как консольное приложение, да ещё и как простой многопотоковый сервер, то не парься и установи Яву :) а пример возьми здесь:
http://www.sources.ru/java/java_server.shtml

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

Heromantor опубликован 13-09-2001 20:09 MSK     Click Here to See the Profile for Heromantor  Click Here to Email Heromantor     
Ну вы блин даете WSAEventSelect()... WaitForSingleObject(это для одного eventa) а WsaAsyncSelect - суксь мастдайная.
ЗЫ: Для WSAAsyncSelect нужон Winsock 2.0
DEiL опубликован 13-09-2001 21:49 MSK     Click Here to See the Profile for DEiL  Click Here to Email DEiL     
нельзя использовать WSA* ;)
надо только socket, bind, listen, accept, connect, send, recv, setsockopt и прочее -)
DEiL опубликован 13-09-2001 23:09 MSK     Click Here to See the Profile for DEiL  Click Here to Email DEiL     
#include <winsock2.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
WSADATA Wsa;
WSAStartup(MAKEWORD(1,1),&Wsa);

SOCKET listener;
sockaddr_in sin;
in_addr addr;
unsigned long argp;
SOCKET s1, connected;
sockaddr addr1;
listener = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
addr.S_un.S_addr = ADDR_ANY;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr = addr;
sin.sin_port = htons(5051);
ioctlsocket(listener,FIONBIO,&argp);
bind(listener,(struct sockaddr*) &sin,sizeof(sin));
listen(listener,10);
int addr_len = sizeof(addr1);

char *recieved = (char *)malloc(2);

while (true)
{
s1=accept(listener,&addr1,&addr_len);
if (s1 != INVALID_SOCKET)
{
connected = s1;
};
if (recv(connected,recieved,1,0)==1)
{
recieved[1] = NULL;
printf(recieved);
};
};
return 0;
}

purpe ;)

зы. правда эта программа выводит на экран сообщения от самого последнего законнектившегося сокета, но это просто пример :)

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.