pasierdamian Temat założony przez niniejszego użytkownika |
Programowanie sieciowe pod Linuksem UDT » 2015-11-16 10:36:57 Witam , próbuje stworzyć program typu chat z 2 klientami i serwerem, mam jednak problem z aplikacją klienta, niestety nie łaczy się on z serwerm. Tu wklejam kod: #include<arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <signal.h> #define BUFLEN 512
int main( int argc, char * argv[] ) { struct sockaddr_in serv_addr; int sockfd, slen = sizeof( serv_addr ); char buf[ BUFLEN ]; if( argc != 3 ) { printf( "Usage : %s <Server-IP>\n", argv[ 2 ] ); exit( 0 ); } uint16_t port = atoi( argv[ 1 ] ); if(( sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == - 1 ) err( "socket" ); bzero( & serv_addr, sizeof( serv_addr ) ); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons( port ); serv_addr.sin_addr.s_addr = inet_addr( argv[ 2 ] ); while( 1 ) { bzero( buf, BUFLEN ); printf( "Attempting to READ to socket %d: ", sockfd ); fflush( stdout ); if( recvfrom( sockfd, buf, BUFLEN, 0,( struct sockaddr * ) & serv_addr, & slen ) == - 1 ) { perror( "Error bind" ); exit( 1 ); } printf( "The message from the server is: %s \n", buf ); printf( "Please enter the message to send: " ); bzero( buf, BUFLEN ); fgets( buf, BUFLEN, stdin ); printf( "Attempting to write to socket %d: ", sockfd ); fflush( stdout ); if( sendto( sockfd, buf, BUFLEN, 0,( struct sockaddr * ) & serv_addr, slen ) == - 1 ) { perror( "Error bind" ); exit( 1 ); } } close( sockfd ); return 0; } Bardzo proszę o pomoc, czego mogło zabraknąć w tej aplikacji |
|
darko202 |
» 2015-11-16 13:33:57 1. co masz w serv_addr.sin_addr.s_addr = inet_addr( argv[ 2 ] ); na https://www.abc.se/~m6695/udp.html jest serwer si_me.sin_addr.s_addr = htonl(INADDR_ANY); a client ? (inet_aton(SRV_IP, &si_other.sin_addr)==0) może jest inaczej niż u Ciebie. 2. jesteś pewny, że serwer działa ? połączyłeś się w jakiś sposób np. poprzez aplikację klienta udt może - pokaż kod serwera. |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-11-16 18:32:56 Serwer dziala na 100 % #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #define BUFOR 512
int main( int argc, char * argv[] ) { int fd, serverLength, cLength; struct sockaddr_in serverAddr, c_addr[ 2 ], clientAddr; cLength = sizeof( clientAddr ); char buf[ BUFOR ]; int clients = 0; int c_port[ 2 ]; if( argc != 2 ) { printf( "Nie podano nazwy portu" ); exit( 1 ); } uint16_t port = atoi( argv[ 1 ] ); if(( fd = socket( AF_INET, SOCK_DGRAM, 0 ) ) == - 1 ) { perror( "Blad socket" ); exit( 1 ); } bzero(( char * ) & serverAddr, sizeof( serverAddr ) ); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl( INADDR_ANY ); serverAddr.sin_port = htons( port ); serverLength = sizeof( serverAddr ); if( bind( fd,( struct sockaddr * ) & serverAddr, serverLength ) == - 1 ) { perror( "Blad bind" ); exit( 1 ); } for(;; ) { printf( "Nasłuch...\n" ); if( recvfrom( fd, buf, BUFOR, 0,( struct sockaddr * ) & clientAddr, & cLength ) == - 1 ) { perror( "Blad recvfrom" ); exit( 1 ); } if( clients == 0 ) { c_addr[ 0 ] = clientAddr; c_port[ 0 ] = ntohs( c_addr[ 0 ].sin_port ); clients++; printf( "Klient 0 został polaczony. Port: %d\n", c_port[ 0 ] ); sendto( fd, "Jestes jedynym klientem.", 24, 0,( struct sockaddr * ) & clientAddr, cLength ); } else if( clients == 1 ) { if( c_port[ 0 ] == ntohs( clientAddr.sin_port ) ) { sendto( fd, "Jestes jedynym klientem.", 24, 0,( struct sockaddr * ) & c_addr[ 0 ], sizeof( c_addr[ 0 ] ) ); printf( "Jeden klient\n" ); } else { c_addr[ 1 ] = clientAddr; c_port[ 1 ] = ntohs( c_addr[ 1 ].sin_port ); clients++; printf( "Drugi klient \n" ); sendto( fd, buf, BUFOR, 0,( struct sockaddr * ) & c_addr[ 0 ], sizeof( c_addr[ 0 ] ) ); } } else { if( c_port[ 0 ] == ntohs( clientAddr.sin_port ) ) { printf( "Wysyalnei wiadomosci do klienta 1\n" ); if( sendto( fd, buf, BUFOR, 0,( struct sockaddr * ) & c_addr[ 1 ], sizeof( c_addr[ 0 ] ) ) == - 1 ) { clients--; perror( "Blad senttoen" ); } } else { printf( "Wysyalnei wiadomosci do klienta 0\n" ); if( sendto( fd, buf, BUFOR, 0,( struct sockaddr * ) & c_addr[ 0 ], sizeof( c_addr[ 1 ] ) ) == - 1 ) { clients--; perror( "Blad senttoen" ); } } } } close( fd ); return 0; } serv_addr.sin_addr.s_addr = inet_addr( argv[ 2 ] ); adres podany jako 3argument liczac nazwe programu |
|
darko202 |
» 2015-11-17 10:48:01 powróćmy do pytania 1. co masz w serv_addr.sin_addr.s_addr = inet_addr( argv[ 2 ] ); jak patrzę na
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspxstruct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[ 8 ]; };
https://msdn.microsoft.com/en-us/library/windows/desktop/ms738571(v=vs.85).aspxtypedef struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, * PIN_ADDR, FAR * LPIN_ADDR;
to cienko widzę zapisanie tego w linii poleceń jako argv[2] spróbuj na razie zrezygnować z takich rzeczy - tzn. podaj jawnie argumenty w programie 2. chyba nie bawiłem się w tworzenie serwera i klienta UDT, ale kiedyś tworząc coś podobnego zacząłem od znalezienia aplikacji demo serwera i klienta i dobijałem się do nich z własnych rozwiązań. 3. jeśli serwer działa - sprawdź co wysyła i co odbiera i spróbuj powtórzyć to dla swojego klienta |
|
« 1 » |