采用 unix 域套接字并且采用udp协议的服务器端C语言程序
时间: 2024-03-05 22:47:43 浏览: 17
以下是采用 UNIX 域套接字并且采用 UDP 协议的服务器端 C 语言程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define SOCKET_FILE "/tmp/udp_socket"
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sock_fd, ret;
struct sockaddr_un server_addr, client_addr;
socklen_t client_len;
char buffer[BUFFER_SIZE];
// 创建套接字
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (sock_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, SOCKET_FILE, sizeof(server_addr.sun_path) - 1);
// 绑定套接字到服务器地址
ret = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
while (1) {
// 接收来自客户端的消息
memset(buffer, 0, sizeof(buffer));
client_len = sizeof(client_addr);
ret = recvfrom(sock_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_len);
if (ret < 0) {
perror("recvfrom");
continue;
}
// 打印接收到的消息
printf("Received message: %s\n", buffer);
// 发送响应到客户端
sprintf(buffer, "hello, client");
ret = sendto(sock_fd, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, client_len);
if (ret < 0) {
perror("sendto");
exit(EXIT_FAILURE);
}
}
// 关闭套接字
close(sock_fd);
return 0;
}
```
在该示例程序中,首先创建了一个 UNIX 域套接字,并将其绑定到了 `/tmp/udp_socket` 文件路径上。然后通过无限循环接收客户端发送的消息,并对每条消息都进行了响应。需要注意的是,在 UNIX 域套接字中,地址结构体使用的是 `sockaddr_un`,而不是 `sockaddr_in`。而UDP协议的套接字是使用SOCK_DGRAM标志创建的。