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);
}
}
Exactly what error is happening? Have you tried to read what the program does? You saw that it asks for a parameter?
– epx
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.– gfleck
do I pass these parameters on the same run? . /localhost client ?
– Leila
@That’s right, that’s right
– gfleck