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.
74 lines
1.9 KiB
74 lines
1.9 KiB
#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"
|
|
#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
|
|
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;
|
|
}
|