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: #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 ); 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 ) ); n = recvfrom( s, recvbuff, MAXLINE, 0, NULL, NULL ); recvbuff[ n ] = 0; fputs( recvbuff, stdout ); } } Serwer: #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 |
|
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 |
|
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. |
|
DejaVu |
» 2014-07-03 11:59:04 |
|
« 1 » |