почему возвращаемое значение strcmp на стороне сервера и на стороне клиента отличается? - PullRequest
0 голосов
/ 30 октября 2019

Я реализую UDP-сервер и клиент на C. В основном я занимаюсь программированием сокетов в Linux.

Клиентская программа останавливается, когда пользователь вводит 'q', и я хочу остановить серверную программузатем также.

Таким образом, моя серверная программа получает пакет со значением 'q' и, используя strcmp(), решает, остановится он или нет.

Но возвращаемое значение strcmp() на стороне сервера - 100, когда полученное сообщение - 'q'. В клиентской программе, если пользователь вводит «q», возвращаемое значение strcmp равно «0». Поэтому я не могу использовать strcmp() так же, как серверную программу.

Я изменил сторону сервера, чтобы она могла остановиться, когда возвращаемое значение strcmp() равно 100, но я не думаю, что этоверно ..

Вы можете мне помочь?

Это серверная часть "UDPserver.c"

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

void error_handling(char *message);

int main(int argc, char **argv) {
    int BUFSIZE= atoi(argv[2]);
    int serv_sock;
    char message[BUFSIZE]; 
    int str_len;

    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    int clnt_addr_size;

    if (argc != 3) {
        printf("Usage : &s &s <port> <buffersize>\n", argv[0]);
        exit(1);
    }

    serv_sock=socket(PF_INET, SOCK_DGRAM, 0);
    if (serv_sock == -1)
        error_handling("UDP 소켓 생성 오류");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(atoi(argv[1]));

    if (bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
        error_handling("bind() error");

    sleep(5);

    while ((str_len = recvfrom(serv_sock, message, BUFSIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) != 0) {
        printf("strcmp %d\n", strcmp(message, "q\n"));
        if (strcmp(message, "q\n") == 100)
            break;
        write(1, message, str_len);
    }

    return 0;
}

void error_handling(char *message) {
        fputs(message, stderr);
        fputc('\n', stderr);
        exit(1);
}

Это клиентская сторона "UDPclient.c"

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

#define BUFSIZE 30

void error_handling(char *message);

int main(int argc, char **argv) {
    int sock;
    char message[BUFSIZE];
    int str_len, addr_size, i;

    char MSG1[] = "0123456789";
    char MSG2[] = "ABCDEFGHIJ";
    char MSG3[] = "KLMNOPQRST";

    struct sockaddr_in serv_addr;
    struct sockaddr_in from_addr;

    if (argc != 3) {
        printf("Usage: %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (sock == -1)
        error_handling("UDP 소켓 오류 생성");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));

    sendto(sock, MSG1, strlen(MSG1), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    sendto(sock, MSG2, strlen(MSG2), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    sendto(sock, MSG3, strlen(MSG3), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    while(1) {
        /* 메시지 입력 전송*/
        fputs("type in a message (q to quit) : ", stdout); // print
        fgets(message, BUFSIZE, stdin); // scanf, save what u type in to message

        sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // write->send 로
        printf("strcmp %d\n", strcmp(message, "q\n"));
        if (!strcmp(message, "q\n"))  // if the input is q, stop
            break;
    }
    close(sock);
    return 0;
}

void error_handling(char *message) {
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

EDIT

Это то, что я изменил на стороне сервера.

    while ((str_len = recvfrom(serv_sock, message, BUFSIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) != 0) {
        message[str_len] = 0;
        if (!strcmp(message, "q\n"))
            break;
        write(1, message, str_len);
    }
...