tc.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <arpa/inet.h>
  8. #include <netinet/in.h>
  9. int main(int argc, char** argv)
  10. {
  11. const char* addr_str = "127.0.0.1";
  12. if (argc > 1)
  13. addr_str = argv[1];
  14. int fd = socket(AF_INET, SOCK_STREAM, 0);
  15. if (fd < 0) {
  16. perror("socket");
  17. return 1;
  18. }
  19. struct timeval timeout { 3, 0 };
  20. int rc = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  21. if (rc < 0) {
  22. perror("setsockopt");
  23. return 1;
  24. }
  25. rc = setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
  26. if (rc < 0) {
  27. perror("setsockopt");
  28. return 1;
  29. }
  30. struct sockaddr_in dst_addr;
  31. memset(&dst_addr, 0, sizeof(dst_addr));
  32. dst_addr.sin_family = AF_INET;
  33. dst_addr.sin_port = htons(8080);
  34. rc = inet_pton(AF_INET, addr_str, &dst_addr.sin_addr);
  35. if (rc < 0) {
  36. perror("inet_pton");
  37. return 1;
  38. }
  39. rc = connect(fd, (struct sockaddr*)&dst_addr, sizeof(dst_addr));
  40. if (rc < 0) {
  41. perror("connect");
  42. return 1;
  43. }
  44. char buffer[BUFSIZ];
  45. const char* msg = "Test message!\n";
  46. rc = send(fd, (const char*)msg, strlen(msg), 0);
  47. if (rc < 0) {
  48. perror("send");
  49. return 1;
  50. }
  51. printf("Message sent.\n");
  52. ssize_t nrecv = recv(fd, buffer, sizeof(buffer), 0);
  53. if (nrecv < 0) {
  54. perror("recvfrom");
  55. return 1;
  56. }
  57. buffer[nrecv] = '\0';
  58. printf("Server: %s\n", buffer);
  59. rc = close(fd);
  60. if (rc < 0) {
  61. perror("close");
  62. return 1;
  63. }
  64. return 0;
  65. }