recvfrom()收到数据,没有填充struct sockaddr和len

       在学习steven的Unix Network Programming的UDP章节时,服务器的recvfrom在接收数据时,发现数据接收到了,但是recvfrom的结构体参数(struct sockaddr*)&client_addr和&len没有被填写,还是初始值。这是因为在recvfrom之前,要对len进行初始化, socklen_t len = sizeof(client_addr); recvfrom函数使用len来确定指针指向的是哪种结构类型
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKET_PATH "/tmp/udp_socket" //服务端bind的地址 #define SOCKET_clientPATH "/tmp/udp_socketclient" #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_un server_addr, client_addr; char buffer[BUFFER_SIZE]; // 创建 UDP Unix 域套接字 sockfd = socket(AF_UNIX, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket 创建失败"); exit(EXIT_FAILURE); } // 设置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); // 设置客户端地址 memset(&client_addr, 0, sizeof(client_addr)); client_addr.sun_family = AF_UNIX; strncpy(client_addr.sun_path, SOCKET_clientPATH, sizeof(client_addr.sun_path) - 1); unlink(SOCKET_clientPATH);//确保路径不存在 if (bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr))< 0 ) { perror("bind error"); close(sockfd); } // 客户端循环发送数据 while (1) { // 发送数据 char *message = "Hello, Server!"; if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("sendto 失败"); close(sockfd); exit(EXIT_FAILURE); } printf("客户端发送: %s\n", message); // 接收服务器响应 socklen_t addr_len = sizeof(client_addr); ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0,NULL, NULL); if (recv_len == -1) { perror("recvfrom 失败"); close(sockfd); exit(EXIT_FAILURE); } buffer[recv_len] = '\0'; printf("客户端收到: %s\n", buffer); sleep(1); // 模拟间隔 } close(sockfd); return 0; } 解析一下,这样写对吗
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值