Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';无法处理Mac的C语言UDP客户端服务器问题_C_Server_Udp_Client - Fatal编程技术网

Can';无法处理Mac的C语言UDP客户端服务器问题

Can';无法处理Mac的C语言UDP客户端服务器问题,c,server,udp,client,C,Server,Udp,Client,我正在用C语言为MacOS编写一个udp客户机-服务器程序。找到了UDP协议的实现,它在Linux上正常工作(我自己检查过),但当我尝试在Mac上构建它时,它会返回一个未声明变量MSG_CONFIRM的警告,当我尝试运行它时,程序不会获取或发送任何消息。我已经试图在谷歌找到一个解决方案,但没有任何。。。我请求强大的程序员,坐在这里寻求帮助。请帮我修复它,或者至少给我一些信息,这样我就可以理解如何修复它了!多谢各位 这是“客户” 编译时,需要编写如下命令:./server-a ip-p端口(输入1

我正在用C语言为MacOS编写一个udp客户机-服务器程序。找到了UDP协议的实现,它在Linux上正常工作(我自己检查过),但当我尝试在Mac上构建它时,它会返回一个未声明变量MSG_CONFIRM的警告,当我尝试运行它时,程序不会获取或发送任何消息。我已经试图在谷歌找到一个解决方案,但没有任何。。。我请求强大的程序员,坐在这里寻求帮助。请帮我修复它,或者至少给我一些信息,这样我就可以理解如何修复它了!多谢各位

这是“客户”


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

recvfrom(sock\u fd,(char*)缓冲区,BUF\u SIZE-1,MSG\u WAITALL,(struct sockaddr*)和server\u addr,&len)
(add-1)最好为
缓冲区[n]='\0'节省空间。可能还有其他问题。Thx,我会检查它说:“MSG_确认标志是一个Linux扩展。”Mac有其他选择吗?
#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);
        }
    }
} 
#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 */
#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