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.

73 lines
1.9 KiB

2 months ago
2 months ago
2 months ago
2 months ago
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <sys/un.h>
  6. #include <unistd.h>
  7. #define SOCKET_PATH "/tmp/unix_dgram_demo"
  8. #define SENDER_PATH "/tmp/unix_dgram_sender"
  9. int main() {
  10. int sock_fd;
  11. struct sockaddr_un server_addr, client_addr;
  12. char buffer[256];
  13. // Create socket
  14. sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
  15. if (sock_fd == -1) {
  16. perror("socket");
  17. exit(EXIT_FAILURE);
  18. }
  19. // Configure client address (we need to bind to send/receive)
  20. memset(&client_addr, 0, sizeof(client_addr));
  21. client_addr.sun_family = AF_UNIX;
  22. strncpy(client_addr.sun_path, SENDER_PATH, sizeof(client_addr.sun_path) - 1);
  23. // Remove socket file if it already exists
  24. unlink(SENDER_PATH);
  25. // Bind to our own address (required for receiving response)
  26. if (bind(sock_fd, (struct sockaddr *)&client_addr, sizeof(client_addr)) == -1) {
  27. perror("bind");
  28. close(sock_fd);
  29. exit(EXIT_FAILURE);
  30. }
  31. // Configure server address
  32. memset(&server_addr, 0, sizeof(server_addr));
  33. server_addr.sun_family = AF_UNIX;
  34. strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1);
  35. // Send message to server
  36. char txbuf[10240] = {0};
  37. for (int i = 0; i < sizeof(txbuf) - 1; i++) {
  38. txbuf[i] = 'a' + (i % 26); // Fill with a-z characters
  39. }
  40. while (1) {
  41. if (sendto(sock_fd, txbuf, 10240, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
  42. perror("sendto");
  43. close(sock_fd);
  44. exit(EXIT_FAILURE);
  45. }
  46. }
  47. printf("Message sent to receiver.\n");
  48. // Receive response
  49. socklen_t server_len = sizeof(server_addr);
  50. ssize_t num_bytes = recvfrom(sock_fd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&server_addr, &server_len);
  51. if (num_bytes == -1) {
  52. perror("recvfrom");
  53. } else {
  54. buffer[num_bytes] = '\0';
  55. printf("Received response: %s\n", buffer);
  56. }
  57. // Clean up
  58. close(sock_fd);
  59. unlink(SENDER_PATH);
  60. return 0;
  61. }