Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets OSX上的UDP客户端_Sockets_Udp_Macos Sierra_Darwin - Fatal编程技术网

Sockets OSX上的UDP客户端

Sockets OSX上的UDP客户端,sockets,udp,macos-sierra,darwin,Sockets,Udp,Macos Sierra,Darwin,我想为Mac OS X上的UDP客户端编译示例代码,但出现以下错误: client.c:91:9: error: use of undeclared identifier 'MSG_CONFIRM' MSG_CONFIRM, (const struct sockaddr *) &servaddr, ^ 我在谷歌上搜索了几个小时的错误,但是没有找到任何与这个问题相关的东西。有人知道问题是什么以及如何解决吗 UDP客户端的代码如下所示 // Client s

我想为Mac OS X上的UDP客户端编译示例代码,但出现以下错误:

client.c:91:9: error: use of undeclared identifier 'MSG_CONFIRM'
        MSG_CONFIRM, (const struct sockaddr *) &servaddr,
        ^
我在谷歌上搜索了几个小时的错误,但是没有找到任何与这个问题相关的东西。有人知道问题是什么以及如何解决吗

UDP客户端的代码如下所示

// Client side implementation of UDP client-server model
#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 <netdb.h>

#define PORT     8080
#define MAXLINE 1024

// Driver code
int main() {
    int sockfd;
    char buffer[MAXLINE];
    char *hello = "Hello from client";
    struct sockaddr_in     servaddr;

    // Creating socket file descriptor
    if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

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

    // Filling server information
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = INADDR_ANY;

    int n, len;

    sendto(sockfd, (const char *)hello, strlen(hello),
        MSG_CONFIRM, (const struct sockaddr *) &servaddr,
            sizeof(servaddr));
    printf("Hello message sent.\n");

    while (1)
    {
        n = recvfrom(sockfd, (char *)buffer, MAXLINE,
                MSG_WAITALL, (struct sockaddr *) &servaddr,
                &len);
        buffer[n] = '\0';
        printf("Server : %s\n", buffer);
    }

    close(sockfd);
    return 0;
}
//UDP客户机-服务器模型的客户端实现
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义端口8080
#定义MAXLINE 1024
//驱动程序代码
int main(){
int-sockfd;
字符缓冲区[MAXLINE];
char*hello=“来自客户的问候”;
servaddr中的结构sockaddr_;
//创建套接字文件描述符
如果((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
perror(“套接字创建失败”);
退出(退出失败);
}
memset(&servaddr,0,sizeof(servaddr));
//填写服务器信息
servaddr.sin_family=AF_INET;
servaddr.sinu端口=htons(端口);
servaddr.sin\u addr.s\u addr=INADDR\u ANY;
int n,len;
sendto(sockfd,(const char*)你好,斯特伦(你好),
MSG_CONFIRM,(const struct sockaddr*)和servaddr,
sizeof(servaddr));
printf(“Hello消息已发送。\n”);
而(1)
{
n=recvfrom(sockfd,(char*)缓冲区,最大线,
MSG_WAITALL,(结构sockaddr*)和servaddr,
&len);
缓冲区[n]='\0';
printf(“服务器:%s\n”,缓冲区);
}
关闭(sockfd);
返回0;
}

我的朋友建议我将MSG\u CONFIRM定义为0。他说搜索它有什么用。你也研究它

#define MSG_CONFIRM 0

显然,socket SDK没有为您编译的平台定义
MSG\u CONFIRM
。因此,要么自己定义它,要么根本不使用它(无论如何,您不应该在示例中使用它:请参见)。我还测试了我的MacOSX。Mac OS没有定义MSG_CONFIRM。我把它设为0。代码会编译并运行,但客户端不会收到服务器发送的消息。我在linux机器上运行了这段代码,两者都运行良好。Geeksforgeks上的代码中有一个错误,您需要将服务器端
recvfrom
中使用的
len
变量初始化为
sizeof cli_addr
。否则,该结构中的客户端主机和端口将为0。在没有使用
MSG
标志进行修正后,我让它在MacOS上工作。