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
|
|||
#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 <stdlib.h> |
|||
#include <string.h> |
|||
#include <unistd.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[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 |
|||
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) { |
|||
perror("recvfrom"); |
|||
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: %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 <stdlib.h> |
|||
#include <string.h> |
|||
#include <unistd.h> |
|||
#include <sys/socket.h> |
|||
#include <sys/un.h> |
|||
#include <unistd.h> |
|||
|
|||
#define SOCKET_PATH "/tmp/unix_dgram_demo" |
|||
#define SENDER_PATH "/tmp/unix_dgram_sender" |
|||
|
|||
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); |
|||
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