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

Komunikator C++ na Linuxie

Ostatnio zmodyfikowano 2014-07-03 11:59
Autor Wiadomość
hackier90
Temat założony przez niniejszego użytkownika
Komunikator C++ na Linuxie
» 2014-07-03 11:21:06
Witam wszystkich!

Mam problem z napisaniem takiego komunikatora. Jestem początkujący w C++.
Przesyłam Wam moje kody:

Klient:
C/C++
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>

#define MAXLINE 100
int main( int argc, char ** argv )
{
    int s;
    struct sockaddr_in servaddr;
    int n, i;
    char sendbuff[ MAXLINE ], recvbuff[ MAXLINE + 1 ];
    if( argc != 2 ) {
        pp printf( "Uzycie: klient adresIP\n" );
        exit( 1 );
    }
    bzero( & servaddr, sizeof( servaddr ) );
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons( 51000 );
    // wstawienie numeru IP do servaddr
    i = inet_pton( AF_INET, argv[ 1 ], & servaddr.sin_addr );
    s = socket( AF_INET, SOCK_DGRAM, 0 );
    if( s < 0 ) {
        perror( "socket" );
        exit( 1 );
    }
    while( fgets( sendbuff, MAXLINE, stdin ) != NULL ) {
        sendto( s, sendbuff, strlen( sendbuff ), 0,( sockaddr * ) & servaddr, sizeof( servaddr ) );
        /* PoniĹźej NULL oznacza, Ĺźe klient odbiera odpowiedĹş od dowolnego serwera */
        n = recvfrom( s, recvbuff, MAXLINE, 0, NULL, NULL );
        recvbuff[ n ] = 0;
        fputs( recvbuff, stdout );
    }
}
Serwer:
C/C++
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>

#define MAXLINE 100

int main( int argc, char ** argv )
{
    int s;
    struct sockaddr_in servaddr, cliaddr;
    ssize_t n;
    socklen_t len;
    char buf[ MAXLINE ];
    s = socket( AF_INET, SOCK_DGRAM, 0 );
    bzero( & servaddr, sizeof( servaddr ) );
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
    servaddr.sin_port = htons( 51000 );
    bind( s,( sockaddr * ) & servaddr, sizeof( servaddr ) );
    for(;; ) {
        n = recvfrom( s, buf, MAXLINE, 0,( sockaddr * ) & cliaddr, & len );
        sendto( s, buf, n, 0,( sockaddr * ) & cliaddr, len );
        printf( "bla: %s", buf );
    }
}
Moim obecnym problemem jest to - jak zawiesić w serwerze tego fora, żeby serwer wyspisywał wszystko co prześle mu użytkownik a nie jak teraz że tylko pierwsze co mu prześle klient? Petla while(1) nie da rezultatu. Obecny kod się ładnie kompiluje.

Pozdrawiam
P-113161
DejaVu
» 2014-07-03 11:24:03
Najłatwiejszym rozwiązaniem jest przełączenie socketów w tryb nieblokujący. Polecałbym Ci użyć innej biblioteki do obsługi socketów aniżeli bawić się w całkowicie niskopoziomowymi narzędziami. Interfejs SFML-a jest bardzo wygodny w użyciu do komunikacji sieciowej.

Niemniej jednak, jeżeli chcesz koniecznie zrobić kod na blokujących socketach i przy pomocy niskopoziomowych narzędzi, to zapoznaj się z dokumentem:

http://cpp0x.pl/kursy​/Kurs-WinSock-C++​/Troche-zaawansowane-techniki​/277
P-113163
hackier90
Temat założony przez niniejszego użytkownika
» 2014-07-03 11:27:01
Zapomniałem dodać że ma działać to na UDP

EDIT: Witaj DejaVu,

spróbowałem odblokować socketa i jest chyba jeszcze gorzej, bo wali mi tym co napisałem mu pierwszym razem z klienta a nadal nie reaguje na następne datagramy.
P-113164
DejaVu
» 2014-07-03 11:59:04
Zapoznaj się z kursem i jego rozdziałami:

http://cpp0x.pl/kursy​/Kurs-WinSock-C++​/Tlo-Klient-Serwer/276

We wspomnianych materiałach jest wszystko opisane co potrzeba.
P-113168
« 1 »
  Strona 1 z 1