Sockets OSX上的UDP客户端
我想为Mac OS X上的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
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上工作。