Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Programowanie sieciowe pod Linuksem UDT

Ostatnio zmodyfikowano 2015-11-17 10:48
Autor Wiadomość
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:
C/C++
#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 
//#define PORT 7777 


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 );
        //recvfrom here
        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 );
        //send to here;
        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
P-140203
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.


P-140207
pasierdamian
Temat założony przez niniejszego użytkownika
» 2015-11-16 18:32:56
Serwer dziala na 100 %

C/C++
#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
P-140225
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).aspx
C/C++
struct 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).aspx

C/C++
typedef 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
P-140271
« 1 »
  Strona 1 z 1