How to run the Client-Server test in C?

Asked

Viewed 241 times

1

I’m studying the basics of networks and I need to run the following code to visualize how communication occurs. I compile both on the Linux terminal, but when running nothing happens.

Is it necessary to change something in the code, or pass some parameter in the execution? I’ve done a lot of research but I can’t find a way to do that.

Filing cabinet cliente.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#include <stdlib.h>
#include <string.h>

#include <fcntl.h> // for open
#include <unistd.h> // for close


#define SERVER_PORT 5432
#define MAX_LINE 256

int main(int argc, char * argv[])
{
    FILE *fp;

    struct hostent *hp;
    struct sockaddr_in sin;

    /* The sockaddr_in structure is used to store addresses for the internet 
        protocol family. Values of this type must be cast to struct             sockaddr for use with the socket interfaces defined in this             document. 

    sa_family_t    sin_family
    in_port_t      sin_port
    struct in_addr sin_addr
    unsigned char  sin_zero[8]

    */ 

    char *host;
    char buf[MAX_LINE];
    int s;
    int len;

    if (argc == 2) {
        host = argv[1];
    }
    else {
        fprintf(stderr, "usage: simplex-talk host\n");
    exit(1);
    }

    /* translate host name into peer’s IP address */
    hp = gethostbyname(host);
    if (!hp) {
        fprintf(stderr, "simplex-talk: unknown host: %s\n", host);
        exit(1);
    }

    /* build address data structure */
    bzero((char *)&sin, sizeof(sin)); /* init with zeros */
    sin.sin_family = AF_INET;
    bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
    sin.sin_port = htons(SERVER_PORT);

    /* active open */
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        perror("simplex-talk: socket");
        exit(1);
    }

    if (connect(s, (struct sockaddr*)&sin, sizeof(sin)) < 0) {
        perror("simplex-talk: connect");
        close(s);
        exit(1);
    }

    /* main loop: get and send lines of text */
    while (fgets(buf, sizeof(buf), stdin)) {
        buf[MAX_LINE-1] = '\0';
        len = strlen(buf) + 1;
        send(s, buf, len, 0);
    }
}

Filing cabinet servidor.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define SERVER_PORT 5432
#define MAX_PENDING 5
#define MAX_LINE 256

#include <stdlib.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#include <strings.h>

int main()
{
    struct sockaddr_in sin;
    char buf[MAX_LINE];
    int len;
    int s, new_s;

    /* build address data structure */
    bzero((char *)&sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(SERVER_PORT);

    /* setup passive open */
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        perror("simplex-talk: socket");
        exit(1);
    }

    if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {
        perror("simplex-talk: bind");
        exit(1);
    }
    listen(s, MAX_PENDING);

    /* wait for connection, then receive and print text */
    while(1) {
        if ((new_s = accept(s, (struct sockaddr *)&sin, &len)) < 0) {
        perror("simplex-talk: accept");
        exit(1);
    }
    while (len = recv(new_s, buf, sizeof(buf), 0))
        fputs(buf, stdout);
        close(new_s);
    }
}
  • 1

    Exactly what error is happening? Have you tried to read what the program does? You saw that it asks for a parameter?

  • You have to pass a parameter when you run the cliente, if the server is running on the same machine try to pass the parameters: localhost, 127.0.0.1 ou 0.0.0.0. If the server is running on another machine pass as parameter the IP of this machine.

  • do I pass these parameters on the same run? . /localhost client ?

  • 1

    @That’s right, that’s right

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.