Ernest171 Temat założony przez niniejszego użytkownika |
winsock » 2010-11-08 07:21:00 Jak próbuje sie połączyć dwoma klientami z jednym serwerem to serwer obsługuje pierwszego klienta i dopiero po rozłączeniu tego pierwszego drugi może się komunikować. Jak zrobić aby móc połączyć się większą ilością klientów ? |
|
DejaVu |
» 2010-11-08 13:43:35 |
|
Ernest171 Temat założony przez niniejszego użytkownika |
winsock » 2010-11-08 15:50:02 dzięki bardzo za pomoc. |
|
Ernest171 Temat założony przez niniejszego użytkownika |
Winsock » 2010-11-08 17:25:41 To co mi wysłałeś jest na linuxa... :( Więc nadal mam ten sam problem że się nie da połączyć więcej niż jednym klientem.Gdy się połączyłem jednym klientem to wszystko działa ale gdy chce drugi się połączyć to nie może dopóki ten pierwszy się nie rozłączy. Więc jak zrobić żeby dało się większą liczbą klientów połączyć. Proszę o pomoc. |
|
malan |
» 2010-11-08 17:56:49 Ostatnio też nad tym myślałem, wiesz? Przymierzam się do napisania jakiś banalnych programików sieciowych i też miałem ten sam problem. Myślałem o wątkach. Czyli, dla każdego nowego klienta utworzyć osobny wątek i go (klienta) obsługiwać. Nie próbowałem tego jeszcze, ale nie wiem, czy to najlepszy pomysł. Jednak po przeczytaniu select() -- Zsynchronizowane wielokrotne operacje I/O już wiem, że wątki są tu zupełnie nie potrzebne. W tym kursie masz wszystko czego potrzebujesz. Przeanalizuj kod, pobaw się nim trochę, napij się spritea, a wtedy sockety staną się pragnieniem :). |
|
DejaVu |
» 2010-11-08 17:58:17 Ten kurs jest zarówno dla linuxa jak i windowsa. Na początku tego kursu jest napisane jakie są różnice w pisaniu. |
|
Ernest171 Temat założony przez niniejszego użytkownika |
wincosk » 2010-11-08 18:54:17 Tam jest cos takiego:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>
#define PORT 9034
int main( void ) { fd_set master; fd_set read_fds; struct sockaddr_in myaddr; struct sockaddr_in remoteaddr; int fdmax; int listener; int newfd; char buf[ 256 ]; int nbytes; int yes = 1; int addrlen; int i, j; FD_ZERO( & master ); FD_ZERO( & read_fds ); if(( listener = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) { perror( "socket" ); exit( 1 ); } if( setsockopt( listener, SOL_SOCKET, SO_REUSEADDR, & yes, sizeof( int ) ) == - 1 ) { perror( "setsockopt" ); exit( 1 ); } myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = INADDR_ANY; myaddr.sin_port = htons( PORT ); memset( &( myaddr.sin_zero ), '\0', 8 ); if( bind( listener,( struct sockaddr * ) & myaddr, sizeof( myaddr ) ) == - 1 ) { perror( "bind" ); exit( 1 ); } if( listen( listener, 10 ) == - 1 ) { perror( "listen" ); exit( 1 ); } FD_SET( listener, & master ); fdmax = listener; for(;; ) { read_fds = master; if( select( fdmax + 1, & read_fds, NULL, NULL, NULL ) == - 1 ) { perror( "select" ); exit( 1 ); } for( i = 0; i <= fdmax; i++ ) { if( FD_ISSET( i, & read_fds ) ) { if( i == listener ) { addrlen = sizeof( remoteaddr ); if(( newfd = accept( listener,( struct sockaddr * ) & remoteaddr, & addrlen ) ) == - 1 ) { perror( "accept" ); } else { FD_SET( newfd, & master ); if( newfd > fdmax ) { fdmax = newfd; } printf( "selectserver: new connection from %s on " "socket %d\n", inet_ntoa( remoteaddr.sin_addr ), newfd ); } } else { if(( nbytes = recv( i, buf, sizeof( buf ), 0 ) ) <= 0 ) { if( nbytes == 0 ) { printf( "selectserver: socket %d hung up\n", i ); } else { perror( "recv" ); } close( i ); FD_CLR( i, & master ); } else { for( j = 0; j <= fdmax; j++ ) { if( FD_ISSET( j, & master ) ) { if( j != listener && j != i ) { if( send( j, buf, nbytes, 0 ) == - 1 ) { perror( "send" ); } } } } } } } } } return 0; }
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>
Tego brak w windowsie.
Jak zrobić żeby pod windowsem działało. |
|
malan |
» 2010-11-08 19:20:41 Po pierwsze - zignoruj sporą ilość wszystkich nagłówków systemowych, których tu użyłem. Wszystko, co musisz dołączyć to:
|
|
|
1 « 2 » 3 4 |