无法解决Mac上使用C语言编写的UDP客户端-服务器问题

时间:2019-11-30 08:57:09

标签: c server udp client

我正在用C语言编写MacOS的udp客户端-服务器程序。找到了UDP协议的实现,并且可以在Linux上正常工作(由我自己检查),但是当我尝试在Mac上进行构建时,它会返回未声明变量MSG_CONFIRM的警告,而当我尝试运行它时,程序不会无法获取或发送任何消息。我已经尝试过在Google中找到解决方案,但是没有任何解决方案……我需要功能强大的程序员,坐在这里寻求帮助。请帮助我修复它,或者至少给我一些信息,以便我了解如何修复它!非常感谢!

这是“客户”

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

#define BUF_SIZE 1024

int main(int argc, char ** argv) {
    Args args = get_args(argc, argv);
    int sock_fd;
    struct sockaddr_in server_addr;

    if ( (sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
        throw(BAD_EXIT_STATUS, "Socket creation failed");
    }

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

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(args.port);
    server_addr.sin_addr.s_addr = inet_addr(args.IP);

    while(1) {
        char buffer[BUF_SIZE];
        char *hello = readline(stdin);
        int n;
        socklen_t len;

        sendto(sock_fd, (const char *) hello, strlen(hello), MSG_CONFIRM,
               (const struct sockaddr *) &server_addr, sizeof(server_addr));
        n = recvfrom(sock_fd, (char *) buffer, BUF_SIZE, MSG_WAITALL,
                     (struct sockaddr *) &server_addr, &len);
        buffer[n] = '\0';
        printf("[Server]: %s", buffer);
    }

    close(sock_fd);
    return 0;
}

这是“服务器”

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <math.h>
#include "utils.h"
#include "obrab.h"

#define BUF_SIZE 1024
#ifndef MSG_CONFIRM
#define MSG_CONFIRM 2048
#endif

int main(int argc, char** argv) {
    Args args = get_args(argc, argv);
    int sock_fd;
    struct sockaddr_in server_addr, client_addr;

    if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        throw(BAD_EXIT_STATUS, "Socket creation failed");
    }

    memset(&server_addr, 0, sizeof(server_addr));
    memset(&client_addr, 0, sizeof(client_addr));

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(args.port);
    server_addr.sin_addr.s_addr = inet_addr(args.IP);

    if (bind(sock_fd, (const struct sockaddr*) &server_addr, sizeof(server_addr)) < 0) {
        throw(BAD_EXIT_STATUS, "Bind failed");
    }

    while(1) {
        char buffer[BUF_SIZE];
        int n;
        socklen_t len;

        n = recvfrom(sock_fd, (char*) buffer, BUF_SIZE,
                MSG_WAITALL, (struct sockaddr*) &client_addr, &len);
        buffer[n] = '\0';
        if (fork() == 0) {
            char *hello = buffer;
            sendto(sock_fd, (const char *) hello, strlen(hello),
                   MSG_CONFIRM, (const struct sockaddr *) &client_addr, len);
        } else {
            printf("[Client]: %s", buffer);
        }
    }
} 

我还创建了一些头文件,下面有一个代码

“ keys.h”

#ifndef keys_h
#define keys_h

// Struct for console arguments
unsigned short int prt;
char* L2ADDR;
char* L2LOGFILE;
unsigned short int L2WAIT;
typedef struct Args {
//    unsigned short int (*L2PORT) (unsigned short int L2PORT);   // -p
//    char* (*L2WAIT) (char* L2ADDR);  //-a
//    char* (*L2LOGFILE) (char* L2LOGFILE); //-l
//    unsigned short int (*L2WAIT) (unsigned short int L2WAIT); //-w
} Args;

char ip[] = "128.0.0.1";
unsigned a, b, c, d;
// reception and recognition of args
Args get_args(int argc, char **argv) {
    Args args = {};
    int opt;
    char *opts = "palwvh";
    while((opt = getopt(argc, argv, opts)) != -1) {
        switch(opt) {
            case 'p':
                break;
            case 'a':
                if (sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 && a < 256) printf("YES\n");
                else {
                    perror("NO\n");
                    exit(2);
                }
                break;
            case 'l':
//                currentParser = lblog;
                break;
            case 'w':
//                currentParser = lbwait;
                break;
            case 'v':
                printf("Version: 0.0.1 omega\n");
                break;
            case 'h':
                printf("Use can use following keys: \n"
                "\t-v -- prints out a version of the program;\n"
                "\t-h -- output of the manual;\n"
                "\t-w N -- Imitates job pausing serving process for N sec;\n"
                "\t-d -- Set up program in daemon-mode;\n"
                "\t-l /path/to/log -- set up a path to log-file;\n"
                "\t-a ip -- Set up an adress in what server listens;\n"
                "\t-p port -- Set up port, in what server listens.\n\n");
                break;
            default:
                perror("Unknown key! Use -h key to read manual");
        }
    }
    return args;
}

#endif /* keys_h */

“ Utils.h”

#ifndef UTILS_H
#define UTILS_H

#define BAD_EXIT_STATUS 1

typedef struct Args {
    int waitFor;    // -w N
    bool isDaemon;  // -d
    char* logFile;  // -l path
    char* IP;       // -a IP
    int port;       // -p port
} Args;

Args get_args(int, char**);

void throw(int, char*);

char * readline(FILE*);

#endif

编译时,您需要编写如下命令:./server -a ip -p端口(输入127.0.0.1和8080)然后您需要在另一个具有类似关键参数的窗口中运行客户端。理论上,您在客户端中编写消息,然后将其发送到服务器。但是它不会发送或接收任何消息。拜托,帮帮我。...

0 个答案:

没有答案