Автор
|
Тема: server socket
|
DEiL |
опубликован 13-09-2001 15:16 MSK
люди, памагити 8) короче, мне нужно написать приложение, наподобин ирц сервера, но на чистом api, и когда я пишу s1=accept(...) иил recv(...), то моя программа ЖДЁТ, пока кто-нибудь не законнектится \ не пошлёт информацию. а ведь это сервер и таких клиентов много и получается билиберда. как это исправить? :) зы. я точно знаю что нужно юзать setsockopt ;)
|
purpe
|
опубликован 13-09-2001 15:27 MSK
тебе нада ваять многопотоковый сервер. одним setsockopt не отделаешься ... Для начала надо научить твой сервер обрабатывать сообщения от сокета типа FD_ACCEPT, FD_READ и т.д. , а вместо setsockopt лучше воспользоваться WSAAsyncSelect. |
purpe
|
опубликован 13-09-2001 15:34 MSK
то что я сказал находится в http://www.sources.ru/download/Diasrv32.zip это простейший UDP сервер на чистом апи. Но он не многопотоковый, и одновременно (если его переделывать на TCP) не сможет обрабатывать запросы пользователей.глянь исходники Apache, но такое количество исходного кода скорее всего приведёт тебя в уныние :)
|
DEiL
|
опубликован 13-09-2001 16:27 MSK
purpe -> в том то всё и дело, что мне не надо обрабатывать эти сообщения и прочую лабуду -) мне нужно консольное приложение с возможностью с минимальными переделками запустить под *nix. вот в чём дело -) |
DEiL
|
опубликован 13-09-2001 17:15 MSK
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
с минимальными не получится! я правда не в курсе, как в консольном приложении отлавливать сообщения от сокета. обычно я это делаю через окошки :)Но если хочешь, чтобы работало одновременно и в линуксе и в винде и при этом как консольное приложение, да ещё и как простой многопотоковый сервер, то не парься и установи Яву :) а пример возьми здесь: http://www.sources.ru/java/java_server.shtml на мой взгляд это оптимальный вариант, который отвечает всем твоим требованиям. я сам этот пример использую довольно часто, если надо, чтобы работало на любой операционке.
|
Heromantor
|
опубликован 13-09-2001 20:09 MSK
Ну вы блин даете WSAEventSelect()... WaitForSingleObject(это для одного eventa) а WsaAsyncSelect - суксь мастдайная. ЗЫ: Для WSAAsyncSelect нужон Winsock 2.0 |
DEiL
|
опубликован 13-09-2001 21:49 MSK
нельзя использовать WSA* ;) надо только socket, bind, listen, accept, connect, send, recv, setsockopt и прочее -) |
DEiL
|
опубликован 13-09-2001 23:09 MSK
#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 ;) зы. правда эта программа выводит на экран сообщения от самого последнего законнектившегося сокета, но это просто пример :)
|