udp server does not receive the udp linux client message

0

Well, I was programming a simple messaging system, when I tried the same computer, it worked correctly without any problems, but when I tested on two different computers, the server did not receive the message from the client I created, help me?

Customer Code

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>

#define SERVER "127.0.0.1"
#define BUFFTAM 1024  //Tamanho maximo do buffer
#define PORTA 8888   //A porta na qual sera enviado os dados

void terminar(char *s)
{
    perror(s);
    exit(1);
}

void IniciarCliente()
{
    struct sockaddr_in servidorsock;/*definindo as variaveis*/
    int s, slen=sizeof(servidorsock);
    char buf[BUFFTAM];
    char mensagem[BUFFTAM];

    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        terminar("socket");
    }

    memset((char *) &servidorsock, 0, sizeof(servidorsock));
    servidorsock.sin_family = AF_INET;
    servidorsock.sin_port = htons(PORTA);

    if (inet_aton(SERVER , &servidorsock.sin_addr) == 0)
    {
        fprintf(stderr, "inet_aton() failed\n");
        exit(1);
    }

    while(strcmp(buf,"fim\n")!=0){
        printf("Digite uma mensagem : ");
        fgets(mensagem,BUFFTAM,stdin);

        //Envia a mensagem
        if (sendto(s, mensagem, strlen(mensagem) , 0 , (struct sockaddr *) &servidorsock, slen)==-1){
            terminar("sendto()");
        }

        //recebe uma mensagem de volta e printa ela na tela
        //limpa o buffer de dados
        memset(buf,'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#define BUFFTAM 1024
#define PORTA 8888

void terminar(char *s)
{
    perror(s);
    exit(1);
}

void IniciarServer(){
    struct sockaddr_in servidorsock, cliente;
    int s, slen = sizeof(cliente);

    char buf[BUFFTAM];

    //cria um scoket udp
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        terminar("socket");
    }

    // zera a estrutura
    memset((char *) &servidorsock, 0, sizeof(servidorsock));

    servidorsock.sin_family = AF_INET;
    servidorsock.sin_port = htons(PORTA);
    servidorsock.sin_addr.s_addr = htonl(INADDR_ANY);

    //faz o bind do socket com a porta
    if( bind(s , (struct sockaddr*)&servidorsock, sizeof(servidorsock) ) == -1){
        terminar("bind");
    }

    //espera por dados
    while(strcmp(buf,"fim\n")!=0){
        printf("Esperando por dados\n");
        fflush(stdout);
        memset(buf,'
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>

#define SERVER "127.0.0.1"
#define BUFFTAM 1024  //Tamanho maximo do buffer
#define PORTA 8888   //A porta na qual sera enviado os dados

void terminar(char *s)
{
    perror(s);
    exit(1);
}

void IniciarCliente()
{
    struct sockaddr_in servidorsock;/*definindo as variaveis*/
    int s, slen=sizeof(servidorsock);
    char buf[BUFFTAM];
    char mensagem[BUFFTAM];

    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        terminar("socket");
    }

    memset((char *) &servidorsock, 0, sizeof(servidorsock));
    servidorsock.sin_family = AF_INET;
    servidorsock.sin_port = htons(PORTA);

    if (inet_aton(SERVER , &servidorsock.sin_addr) == 0)
    {
        fprintf(stderr, "inet_aton() failed\n");
        exit(1);
    }

    while(strcmp(buf,"fim\n")!=0){
        printf("Digite uma mensagem : ");
        fgets(mensagem,BUFFTAM,stdin);

        //Envia a mensagem
        if (sendto(s, mensagem, strlen(mensagem) , 0 , (struct sockaddr *) &servidorsock, slen)==-1){
            terminar("sendto()");
        }

        //recebe uma mensagem de volta e printa ela na tela
        //limpa o buffer de dados
        memset(buf,'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ctype.h>
#define BUFFTAM 1024
#define PORTA 8888

void terminar(char *s)
{
    perror(s);
    exit(1);
}

void IniciarServer(){
    struct sockaddr_in servidorsock, cliente;
    int s, slen = sizeof(cliente);

    char buf[BUFFTAM];

    //cria um scoket udp
    if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        terminar("socket");
    }

    // zera a estrutura
    memset((char *) &servidorsock, 0, sizeof(servidorsock));

    servidorsock.sin_family = AF_INET;
    servidorsock.sin_port = htons(PORTA);
    servidorsock.sin_addr.s_addr = htonl(INADDR_ANY);

    //faz o bind do socket com a porta
    if( bind(s , (struct sockaddr*)&servidorsock, sizeof(servidorsock) ) == -1){
        terminar("bind");
    }

    //espera por dados
    while(strcmp(buf,"fim\n")!=0){
        printf("Esperando por dados\n");
        fflush(stdout);
        memset(buf,'%pre%',BUFFTAM);

        //tenta receber algum dado do cliente
        if (recvfrom(s, buf, BUFFTAM, 0, (struct sockaddr *) &cliente, (socklen_t*)&slen) == -1){
            terminar("recvfrom()");
        }

        //imprime os dados recebidos
        printf("Origem do cliente %s:%d\n", inet_ntoa(cliente.sin_addr), ntohs(cliente.sin_port));
        printf("mensagem: %s\n" , buf);

        printf("Digite a mensagem que deseja enviar ao cliente : ");
        fgets(buf,BUFFTAM,stdin);

        //retorna o cliente com a mensagem
        if (sendto(s, buf, strlen(buf), 0, (struct sockaddr*) &cliente, slen) == -1){
            terminar("sendto()");
        }
    }

}


int main()
{
    IniciarServer();
    return 0;
}
', BUFFTAM); printf("pacote enviado com sucesso!"); //tenta receber dados do servidor if (recvfrom(s, buf, BUFFTAM, 0, (struct sockaddr *) &servidorsock, (socklen_t *)&slen) == -1){ terminar("recvfrom()"); } printf("pacote recebido com sucesso!"); //printa os dados recebidos printf("%s\n",buf); } close(s); } int main() { IniciarCliente(); return 0; }
',BUFFTAM); //tenta receber algum dado do cliente if (recvfrom(s, buf, BUFFTAM, 0, (struct sockaddr *) &cliente, (socklen_t*)&slen) == -1){ terminar("recvfrom()"); } //imprime os dados recebidos printf("Origem do cliente %s:%d\n", inet_ntoa(cliente.sin_addr), ntohs(cliente.sin_port)); printf("mensagem: %s\n" , buf); printf("Digite a mensagem que deseja enviar ao cliente : "); fgets(buf,BUFFTAM,stdin); //retorna o cliente com a mensagem if (sendto(s, buf, strlen(buf), 0, (struct sockaddr*) &cliente, slen) == -1){ terminar("sendto()"); } } } int main() { IniciarServer(); return 0; }
', BUFFTAM); printf("pacote enviado com sucesso!"); //tenta receber dados do servidor if (recvfrom(s, buf, BUFFTAM, 0, (struct sockaddr *) &servidorsock, (socklen_t *)&slen) == -1){ terminar("recvfrom()"); } printf("pacote recebido com sucesso!"); //printa os dados recebidos printf("%s\n",buf); } close(s); } int main() { IniciarCliente(); return 0; }

server code

%pre%

I do not know exactly what it is, I've reviewed this code from top to bottom, but still can not find what's wrong with it, if anyone can help me, I'd appreciate it.

    
asked by anonymous 26.06.2017 / 06:55

1 answer

0

I was able to solve the problem, for those who have the same problem as me, the solution is:

If you are using two different machines to connect, you will need to go to your router settings and try to change the dynamic IP of your machine generated by the router and make it a static IP on your network, from which you can use this machine as a server, and some other machine as a client, but remember to set the static IP you created on the server in the client code to be able to connect.

  

Tip: Try to look for some program that does this (change the dynamic IP of a machine to a static IP), since making the ip of your machine as static by the router is a very laborious task

If you are using a virtual machine (VM or virtual machine), which was my case, the process becomes simpler, when selecting your VM you just need to configure your nat network in File

01.07.2017 / 19:37