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

Prosty jednokierunkowy chat z wykorzystaniem gniazd (socket)

Ostatnio zmodyfikowano 2018-03-21 19:49
Autor Wiadomość
MadMax0
Temat założony przez niniejszego użytkownika
Prosty jednokierunkowy chat z wykorzystaniem gniazd (socket)
» 2018-03-21 12:04:34
Dzień dobry,

kod serwera:
C/C++
#include <stdio.h>      /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), bind(), and connect() */
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
#include <netinet/in.h>
#include <stdlib.h>     /* for atoi() and exit() */
#include <string.h>     /* for memset() */
#include <unistd.h>     /* for close() */
#include <stdio.h>  /* for perror() */
#include <stdlib.h> /* for exit() */
#include <string.h>

#define MYPORT 3490

int main( int argc, char * argv ) {
   
    struct sockaddr_in my_addr;
    struct sockaddr_in cli_addr;
    int sockfd;
    int newsockfd;
    socklen_t clilen;
    int control;
    char client_message[ 2000 ];
    char buffer[ 256 ];
   
    //socket declaration
    sockfd = socket( AF_INET, SOCK_STREAM, 0 );
   
    //filling struct
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons( MYPORT );
    my_addr.sin_addr.s_addr = INADDR_ANY;
    memset( &( my_addr.sin_zero ), '0', 8 );
   
    //binding socket to address and port
    bind( sockfd,( struct sockaddr * ) & my_addr, sizeof( my_addr ) );
   
    //listening on the socket
    listen( sockfd, 5 );
    clilen = sizeof( cli_addr );
   
    //accepting connection
    if( newsockfd = accept( sockfd,( struct sockaddr * ) & cli_addr, & clilen ) < 0 ) {
        printf( "Unable to connect" );
    }
    else
    {
        printf( "Connected with %s", inet_ntoa( cli_addr.sin_addr ) );
    }
   
    while(( control = recv( newsockfd, client_message, 2000, 0 ) ) > 0 )
    {
        //printing the message
        printf( "%s", client_message );
    }
    if( control == 0 )
         printf( "Disconneted" );
   
    if( control == - 1 )
         printf( "Error" );
   
}

kod klienta
C/C++
/*
* client.cpp
*
*  Created on: Mar 21, 2018
*      Author: piotr
*/

#include <stdio.h>      /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), bind(), and connect() */
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
#include <netinet/in.h>
#include <stdlib.h>     /* for atoi() and exit() */
#include <string.h>     /* for memset() */
#include <unistd.h>     /* for close() */
#include <stdio.h>  /* for perror() */
#include <stdlib.h> /* for exit() */
#include <string.h>

int main( int argc, char * argv[] ) {
   
    int n;
    int client;
    int dest_port = 3490;
    char message[ 1000 ], server_reply[ 2000 ];
   
   
    struct sockaddr_in server_addr;
   
   
    client = socket( AF_INET, SOCK_STREAM, 0 );
   
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons( dest_port );
    server_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    memset( &( server_addr.sin_zero ), '0', 8 );
   
   
   
    connect( client,( struct sockaddr * ) & server_addr, sizeof( server_addr ) );
   
   
   
    printf( "Podaj wiadomosc: " );
    scanf( "%s", message );
   
    if( send( client, message, strlen( message ), 0 ) < 0 )
         printf( "Send failed" );
   
}

Serwer działa prawidłowo, tzn. nasłuchuje na danym porcie, jednak podczas uruchomienia programu klienta, serwer odpowiada następująco: Connected with 127.0.0.1 Error. Tzn, że realizowana jest ostatnia linijka mojego kodu serwera, tzn., że funkcja recv nieprawidłowo odebrała to co klient chce wysłać.

Czy moglibyście mnie naprowadzić na rozwiązanie tego problemu?
P-170138
pekfos
» 2018-03-21 19:09:58
C/C++
if( newsockfd = accept( sockfd,( struct sockaddr * ) & cli_addr, & clilen ) < 0 )
Zapomniałeś nawiasu.
P-170141
MadMax0
Temat założony przez niniejszego użytkownika
» 2018-03-21 19:49:44
Zdążyłem już rozpoznać problem poprzez wygooglowanie errora, który wyrzucał mi recv (Socket operation on non-socket).

if( newsockfd = accept( sockfd,( struct sockaddr * ) & cli_addr, & clilen ) < 0 )

powyższa linijka nie tworzy prawidłowo nowego socketu, ponieważ, jak słusznie zauważył pekfos, brakuje tutaj nawiasu. Dla podpowiedzi podam, że trzeba sprawdzić co ma większy priorytet - przypisanie wartości czy sprawdzenie warunku (==, >, <)

Dziękuje pekfos za odpowiedź.

Pozdrawiam
P-170142
« 1 »
  Strona 1 z 1