Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
1,148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. //client.c
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <sys/socket.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <pthread.h>
  10.  
  11. #define PORT 8080
  12. #define DATA_SIZE 64
  13.  
  14. void receive_data(void *sockfd)
  15. {
  16. int *sock = (int *)sockfd;
  17. char receive[64] = {0};
  18.  
  19. //while(1){
  20. // recv(*sockfd, &receive, DATA_SIZE, 0);
  21. // if(receive != EOF){
  22. // printf("From server: %s", receive);
  23. // }
  24. //}
  25. printf("Test.");
  26. sleep(5000);
  27. }
  28.  
  29. void second_thread()
  30. {
  31. printf("From second thread.");
  32. sleep(5000);
  33. }
  34.  
  35. struct packet{
  36. char hostname[16];
  37. char msg[64];
  38. };
  39.  
  40. void exit_error(char *msg)
  41. {
  42. printf("Failed at stage: %s", msg);
  43. exit(1);
  44. }
  45.  
  46. int main(void)
  47. {
  48. int sockfd;
  49. struct sockaddr_in serv_addr;
  50.  
  51. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  52. exit_error("Failed to create socket.");
  53.  
  54. serv_addr.sin_family = AF_INET;
  55. serv_addr.sin_port = htons(PORT);
  56. serv_addr.sin_addr.s_addr = inet_addr("some_ip");
  57.  
  58. if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
  59. exit_error("Failed to connect.");
  60.  
  61. char welcome[64] = {0};
  62. read(sockfd, &welcome, DATA_SIZE);
  63. printf("%s\n", welcome);
  64. fflush(stdout);
  65.  
  66. pthread_t recv_thread;
  67. pthread_create(&recv_thread, NULL, receive_data, (void *)&sockfd);
  68. pthread_t second_thread;
  69. pthread_create(&second_thread, NULL, second_thread, NULL);
  70. pthread_join(recv_thread, NULL);
  71. pthread_join(second_thread, NULL);
  72.  
  73. char transmit[64];
  74.  
  75. while(1){
  76. bzero(&transmit, sizeof(transmit));
  77. printf("You: ");
  78. fflush(stdout);
  79. fgets(transmit, DATA_SIZE, stdin);
  80. send(sockfd, &transmit, sizeof(transmit), 0);
  81. }
  82.  
  83. return 0;
  84. }
  85.  
  86. //server.c
  87.  
  88. #include <stdio.h>
  89. #include <stdlib.h>
  90. #include <sys/socket.h>
  91. #include <sys/select.h>
  92. #include <string.h>
  93. #include <memory.h>
  94. #include <unistd.h>
  95. #include <arpa/inet.h>
  96. #include <netinet/in.h>
  97.  
  98. #define SERVER_PORT 8080
  99. #define DATA_SIZE 64
  100.  
  101. struct packet{
  102. char hostname[16];
  103. char msg[64];
  104. };
  105.  
  106. struct fd_container{
  107. fd_set readfds;
  108. int fdsize;
  109. int state;
  110. };
  111.  
  112. void error_exit(char *msg)
  113. {
  114. printf("Failed at stage: %s", msg);
  115. exit(1);
  116. }
  117.  
  118. int main()
  119. {
  120. int serverfd;
  121. if((serverfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  122. error_exit("Failed to create socket.");
  123.  
  124. struct sockaddr_in serv_addr;
  125. serv_addr.sin_family = AF_INET;
  126. serv_addr.sin_port = htons(SERVER_PORT);
  127. serv_addr.sin_addr.s_addr = INADDR_ANY;
  128. memset(&serv_addr.sin_zero, '\0', 8);
  129. socklen_t addrlen = sizeof(serv_addr);
  130.  
  131. if(bind(serverfd, (struct sockaddr *)&serv_addr, addrlen) < 0)
  132. error_exit("Failed to bind socket to address.");
  133.  
  134. int yes = 1;
  135. setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  136.  
  137. if((listen(serverfd, 3)) < 0)
  138. error_exit("Failed to listen.");
  139.  
  140. int clientfd1 = accept(serverfd, (struct sockaddr *)&serv_addr, &addrlen);
  141. int clientfd2 = accept(serverfd, (struct sockaddr *)&serv_addr, &addrlen);
  142.  
  143. if(clientfd1 < 0 && clientfd2 < 0){
  144. error_exit("No clients.");
  145. }
  146. else
  147. printf("Up and running.");
  148.  
  149. char welcome[64] = "Connected to server.";
  150. send(clientfd1, &welcome, DATA_SIZE, 0);
  151. send(clientfd2, &welcome, DATA_SIZE, 0);
  152.  
  153. struct fd_container fdlist;
  154. FD_SET(serverfd, &fdlist.readfds);
  155. fdlist.fdsize = clientfd2 + 1;
  156.  
  157. char receive[64]; char transmit[64];
  158.  
  159. while(1){
  160. bzero(&receive, DATA_SIZE);
  161. bzero(&transmit, DATA_SIZE);
  162.  
  163. FD_ZERO(&fdlist.readfds);
  164. FD_SET(clientfd1, &fdlist.readfds);
  165. FD_SET(clientfd2, &fdlist.readfds);
  166.  
  167. fdlist.state = select(fdlist.fdsize, &fdlist.readfds, NULL, NULL, NULL);
  168.  
  169. switch(fdlist.state){
  170. case -1:
  171. error_exit("Failed to select.");
  172. case 0:
  173. printf("No data received in recent time period.");
  174. break;
  175. default:
  176. if(FD_ISSET(clientfd1, &fdlist.readfds)){
  177. recv(clientfd1, &receive, DATA_SIZE, 0);
  178. printf("Incoming data from client1: %s", receive);
  179. strcpy(transmit, receive);
  180. transmit[DATA_SIZE-1] = '\0';
  181. send(clientfd2, &transmit, DATA_SIZE, 0);
  182. }
  183. if(FD_ISSET(clientfd2, &fdlist.readfds)){
  184. recv(clientfd2, &receive, DATA_SIZE, 0);
  185. printf("Incoming data from client2: %s", receive);
  186. strcpy(transmit, receive);
  187. transmit[DATA_SIZE-1] = '\0';
  188. send(clientfd1, &transmit, DATA_SIZE, 0);
  189. }
  190. }
  191. }
  192.  
  193. return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement