You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define SOCKET_PATH "/tmp/unix_dgram_demo"
int main() { int sock_fd; struct sockaddr_un server_addr, client_addr; socklen_t client_len; char buffer[10240];
// Create socket
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); if (sock_fd == -1) { perror("socket"); exit(EXIT_FAILURE); }
// Remove socket file if it already exists
unlink(SOCKET_PATH);
// Configure server address
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);
// Bind socket to address
if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); close(sock_fd); exit(EXIT_FAILURE); }
// 设置超时时间为5秒
struct timeval tv; tv.tv_sec = 1; // 秒
tv.tv_usec = 0; // 微秒
// 设置SO_RCVTIMEO选项
if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { perror("setsockopt failed"); return -1; }
printf("Receiver is waiting for messages on %s...\n", SOCKET_PATH);
while (1) { // Receive message
client_len = sizeof(client_addr); ssize_t num_bytes = recvfrom(sock_fd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&client_addr, &client_len); if (num_bytes == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // 超时错误
printf("No message received within the timeout period.\n"); continue; }
perror("!!!recvfrom"); exit(EXIT_FAILURE); } else { buffer[num_bytes] = '\0'; printf("Received message: %d\n", num_bytes); } }
// Clean up
close(sock_fd); unlink(SOCKET_PATH);
return 0; }
|