Я пытаюсь повторить строку с сервера на клиент с сокетами UDP, но это не удается? - PullRequest
0 голосов
/ 14 ноября 2018

Я установил связь между одним сервером и одним клиентом через UDP-сокеты . Работа, которую я пытаюсь сделать, заключается в том, что клиент передаст строку в аргументах, и эта строка будет отправлена ​​на сервер с использованием UDP-сокетов . После получения строки сервер снова отправит эхо (отправит) строку обратно клиенту. Ниже приведены коды для обоих:

код для echoClient.c :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define MAXLINE 4096

int main(int argc, char const *argv[])
{
    int sockfd;
    struct sockaddr_in servAddr;
    char sendLine[MAXLINE],recvLine[MAXLINE];

    if(argc!=3)
    {
        printf("echoClient <Ip addr. of the server> <String to be echoed> \n");
        exit(1);
    }

    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    {
        printf("Error in creating the socket\n");
        exit(2);
    }


    memset(&servAddr,0,sizeof(servAddr));

    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(6565);    // setting up the port
    servAddr.sin_addr.s_addr = inet_addr(argv[1]);  // using the given ip address of the server

    printf("%s\n", argv[2]);

    if((sendto(sockfd,(const char  *)argv[2],strlen(argv[2]), MSG_CONFIRM,(struct sockaddr *) &servAddr, sizeof(servAddr))!=-1))
    {
        printf("data is sent to the server\n");
    }
    else
    {
        printf("can't send the data to the server\n");
        exit(3);
    }

    int n = recvfrom(sockfd,(char * ) recvLine,MAXLINE,0,(struct sockaddr * )&servAddr,sizeof(servAddr));

    if(n==-1)
    {
        printf("Can't receive the data from the server\n");
        exit(4);
    }

    recvLine[n] = '\0'; // to terminate the received string

    printf("%s\n",recvLine);


    return 0;
}

код для echoServer.c :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define MAXLINE 4096

int main(int argc, char const *argv[])
{
    int sockfd;
    struct sockaddr_in servAddr,clientAddr;
    char sendLine[MAXLINE],recvLine[MAXLINE];

    if(argc!=1)
    {
        printf("echoServer\n");
        exit(1);
    }

    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    {
        printf("Error in creating the socket\n");
        exit(2);
    }


    memset(&servAddr,0,sizeof(servAddr));
    memset(&clientAddr,0,sizeof(clientAddr));


    // filling the details of the server ip and port
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(6565);
    servAddr.sin_addr.s_addr = INADDR_ANY;  // using the given ip address of the server

    if(bind(sockfd,(struct sockaddr * )&servAddr,sizeof(servAddr))<0)
    {
        printf("Binding of the socket failed\n");
        exit(1);
    }

    printf("Server is Up... Waiting for the client...\n");

    int len;
    int n = recvfrom(sockfd,(char *) recvLine,MAXLINE,MSG_WAITALL,(struct sockaddr * )&clientAddr,&len);

    if(n==-1)
    {
        printf("can't get the message from the client\n");
        exit(2);
    }

    recvLine[n] = '\0';

    printf("Message received from the client is %s\n",recvLine);

    if(sendto(sockfd,(char *) recvLine,n,MSG_CONFIRM,(struct sockaddr *)&clientAddr,len)<0)
    {
        printf("can't send the message to the client\n");
        exit(3);
    }

    return 0;
}

Теперь проблема заключается в том, что когда я выполняю вышеуказанные коды, клиент может отправить строку на сервер , но сервер не может отправить строку обратно клиенту .Server выдает ошибку не может отправить сообщение клиенту .

Я не могу определить ошибку, которая останавливает сервер, чтобы отправить сообщение клиенту. Пожалуйста, помогите мне с этим.

Я запускаю echoClient.c с командой: . / A.out 127.0.0.1 hellofromclientside

1 Ответ

0 голосов
/ 14 ноября 2018

На сервере вы не заметили, что аргумент len до recvfrom() является аргументом значение-результат, который перед вызовом необходимо инициализировать до размера clientAddr, чтобы получить этот адрес, поэтому изменить

    int len;

до

    int len = sizeof clientAddr;

Аналогично в клиенте измените

    int n = recvfrom(sockfd,(char * ) recvLine,MAXLINE,0,(struct sockaddr * )&servAddr,sizeof(servAddr));

до

    int len = sizeof servAddr;
    int n = recvfrom(sockfd, recvLine, MAXLINE, 0, (struct sockaddr *)&servAddr, &len);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...