7 changed files with 197 additions and 118 deletions
-
53src/components/linuxsocket/unix_socket.cpp
-
1src/components/linuxsocket/unix_socket.hpp
-
2src/configs/version.hpp
-
21src/main.cpp
-
8test/auto.sh
-
110test/receiver.c
-
120test/sender.c
@ -1,2 +1,2 @@ |
|||||
#pragma once
|
#pragma once
|
||||
#define VERSION "1.3"
|
|
||||
|
#define VERSION "1.4"
|
@ -0,0 +1,8 @@ |
|||||
|
#!/bin/bash |
||||
|
# 循环指令./sender 随即休眠0.1,0.2,0.3 后杀死 进程 |
||||
|
while true; do |
||||
|
./sender & |
||||
|
sleep $(printf "0.%03d" $(( RANDOM % 100 ))) |
||||
|
killall sender |
||||
|
echo "Killed sender process" |
||||
|
done |
@ -1,63 +1,75 @@ |
|||||
|
#include <errno.h> |
||||
#include <stdio.h> |
#include <stdio.h> |
||||
#include <stdlib.h> |
#include <stdlib.h> |
||||
#include <string.h> |
#include <string.h> |
||||
#include <unistd.h> |
|
||||
#include <sys/socket.h> |
#include <sys/socket.h> |
||||
#include <sys/un.h> |
#include <sys/un.h> |
||||
|
#include <unistd.h> |
||||
|
|
||||
#define SOCKET_PATH "/tmp/unix_dgram_demo" |
#define SOCKET_PATH "/tmp/unix_dgram_demo" |
||||
|
|
||||
int main() { |
int main() { |
||||
int sock_fd; |
|
||||
struct sockaddr_un server_addr, client_addr; |
|
||||
socklen_t client_len; |
|
||||
char buffer[256]; |
|
||||
|
|
||||
// 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); |
|
||||
} |
|
||||
|
|
||||
printf("Receiver is waiting for messages on %s...\n", SOCKET_PATH); |
|
||||
|
|
||||
|
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 |
// 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); |
|
||||
|
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 (num_bytes == -1) { |
||||
perror("recvfrom"); |
|
||||
|
if (errno == EAGAIN || errno == EWOULDBLOCK) { // 超时错误 |
||||
|
printf("No message received within the timeout period.\n"); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
perror("!!!recvfrom"); |
||||
|
exit(EXIT_FAILURE); |
||||
} else { |
} else { |
||||
buffer[num_bytes] = '\0'; |
|
||||
printf("Received message: %s\n", buffer); |
|
||||
|
|
||||
// Send response |
|
||||
const char *response = "Hello from receiver!"; |
|
||||
if (sendto(sock_fd, response, strlen(response), 0, |
|
||||
(struct sockaddr *)&client_addr, client_len) == -1) { |
|
||||
perror("sendto"); |
|
||||
} |
|
||||
|
buffer[num_bytes] = '\0'; |
||||
|
printf("Received message: %d\n", num_bytes); |
||||
} |
} |
||||
|
|
||||
// Clean up |
|
||||
close(sock_fd); |
|
||||
unlink(SOCKET_PATH); |
|
||||
|
|
||||
return 0; |
|
||||
|
} |
||||
|
|
||||
|
// Clean up |
||||
|
close(sock_fd); |
||||
|
unlink(SOCKET_PATH); |
||||
|
|
||||
|
return 0; |
||||
} |
} |
@ -1,70 +1,74 @@ |
|||||
#include <stdio.h> |
#include <stdio.h> |
||||
#include <stdlib.h> |
#include <stdlib.h> |
||||
#include <string.h> |
#include <string.h> |
||||
#include <unistd.h> |
|
||||
#include <sys/socket.h> |
#include <sys/socket.h> |
||||
#include <sys/un.h> |
#include <sys/un.h> |
||||
|
#include <unistd.h> |
||||
|
|
||||
#define SOCKET_PATH "/tmp/unix_dgram_demo" |
#define SOCKET_PATH "/tmp/unix_dgram_demo" |
||||
#define SENDER_PATH "/tmp/unix_dgram_sender" |
#define SENDER_PATH "/tmp/unix_dgram_sender" |
||||
|
|
||||
int main() { |
int main() { |
||||
int sock_fd; |
|
||||
struct sockaddr_un server_addr, client_addr; |
|
||||
char buffer[256]; |
|
||||
|
|
||||
// Create socket |
|
||||
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); |
|
||||
if (sock_fd == -1) { |
|
||||
perror("socket"); |
|
||||
exit(EXIT_FAILURE); |
|
||||
} |
|
||||
|
|
||||
// Configure client address (we need to bind to send/receive) |
|
||||
memset(&client_addr, 0, sizeof(client_addr)); |
|
||||
client_addr.sun_family = AF_UNIX; |
|
||||
strncpy(client_addr.sun_path, SENDER_PATH, sizeof(client_addr.sun_path) - 1); |
|
||||
|
|
||||
// Remove socket file if it already exists |
|
||||
unlink(SENDER_PATH); |
|
||||
|
|
||||
// Bind to our own address (required for receiving response) |
|
||||
if (bind(sock_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) == -1) { |
|
||||
perror("bind"); |
|
||||
close(sock_fd); |
|
||||
exit(EXIT_FAILURE); |
|
||||
} |
|
||||
|
|
||||
// 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); |
|
||||
|
|
||||
// Send message to server |
|
||||
const char *message = "Hello from sender!"; |
|
||||
if (sendto(sock_fd, message, strlen(message), 0, |
|
||||
(struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { |
|
||||
perror("sendto"); |
|
||||
close(sock_fd); |
|
||||
exit(EXIT_FAILURE); |
|
||||
} |
|
||||
|
|
||||
printf("Message sent to receiver.\n"); |
|
||||
|
|
||||
// Receive response |
|
||||
socklen_t server_len = sizeof(server_addr); |
|
||||
ssize_t num_bytes = recvfrom(sock_fd, buffer, sizeof(buffer) - 1, 0, |
|
||||
(struct sockaddr *)&server_addr, &server_len); |
|
||||
if (num_bytes == -1) { |
|
||||
perror("recvfrom"); |
|
||||
} else { |
|
||||
buffer[num_bytes] = '\0'; |
|
||||
printf("Received response: %s\n", buffer); |
|
||||
} |
|
||||
|
|
||||
// Clean up |
|
||||
|
int sock_fd; |
||||
|
struct sockaddr_un server_addr, client_addr; |
||||
|
char buffer[256]; |
||||
|
|
||||
|
// Create socket |
||||
|
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); |
||||
|
if (sock_fd == -1) { |
||||
|
perror("socket"); |
||||
|
exit(EXIT_FAILURE); |
||||
|
} |
||||
|
|
||||
|
// Configure client address (we need to bind to send/receive) |
||||
|
memset(&client_addr, 0, sizeof(client_addr)); |
||||
|
client_addr.sun_family = AF_UNIX; |
||||
|
strncpy(client_addr.sun_path, SENDER_PATH, sizeof(client_addr.sun_path) - 1); |
||||
|
|
||||
|
// Remove socket file if it already exists |
||||
|
unlink(SENDER_PATH); |
||||
|
|
||||
|
// Bind to our own address (required for receiving response) |
||||
|
if (bind(sock_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) == -1) { |
||||
|
perror("bind"); |
||||
close(sock_fd); |
close(sock_fd); |
||||
unlink(SENDER_PATH); |
|
||||
|
|
||||
return 0; |
|
||||
|
exit(EXIT_FAILURE); |
||||
|
} |
||||
|
|
||||
|
// 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); |
||||
|
|
||||
|
// Send message to server |
||||
|
char txbuf[10240] = {0}; |
||||
|
for (int i = 0; i < sizeof(txbuf) - 1; i++) { |
||||
|
txbuf[i] = 'a' + (i % 26); // Fill with a-z characters |
||||
|
} |
||||
|
|
||||
|
while (1) { |
||||
|
if (sendto(sock_fd, txbuf, 10240, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { |
||||
|
perror("sendto"); |
||||
|
close(sock_fd); |
||||
|
exit(EXIT_FAILURE); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
printf("Message sent to receiver.\n"); |
||||
|
|
||||
|
// Receive response |
||||
|
socklen_t server_len = sizeof(server_addr); |
||||
|
ssize_t num_bytes = recvfrom(sock_fd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&server_addr, &server_len); |
||||
|
if (num_bytes == -1) { |
||||
|
perror("recvfrom"); |
||||
|
} else { |
||||
|
buffer[num_bytes] = '\0'; |
||||
|
printf("Received response: %s\n", buffer); |
||||
|
} |
||||
|
|
||||
|
// Clean up |
||||
|
close(sock_fd); |
||||
|
unlink(SENDER_PATH); |
||||
|
|
||||
|
return 0; |
||||
} |
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue