Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.18 KB | None | 0 0
  1. Kod programy Serwer:
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <unistd.h>
  8. #include <signal.h>
  9. #include <sys/types.h>
  10. #include <netinet/in.h>
  11. #include <sys/resource.h>
  12. #include <sys/wait.h>
  13. #include <sys/time.h>
  14.  
  15. #define MAX 4096
  16. #define LISTENQ 1024
  17. #define SIZE 2
  18.  
  19. void err_sys(char *s)
  20. {
  21. printf("%s\n",s);
  22. exit (-1);
  23. }
  24. union val
  25. {
  26. int i_val;
  27. long l_val;
  28. char c_val[10];
  29. struct linger linger_val;
  30. struct timeval timeval_val;
  31. } val;
  32. static char *sock_str_int(union val *, int);
  33. struct sock_opts
  34. {
  35. char *opt_str;
  36. int opt_level;
  37. int opt_name;
  38. char *(*opt_val_str)(union val *,int);
  39. }
  40. sock_opts[] = {
  41. "SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, sock_str_int,
  42. "SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, sock_str_int,
  43. };
  44.  
  45. static char strres[128];
  46. static char *
  47. sock_str_int (union val *ptr, int len)
  48. {
  49. if(len != sizeof(int))
  50. snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
  51. else
  52. snprintf(strres, sizeof(strres), "%d", ptr->i_val);
  53. return(strres);
  54. }
  55.  
  56. int main(int arg, char **argv)
  57. {
  58. int connfd, listenfd, sockfd, i, j=0, liczba[2], wynik=0, tmp=0, maxfd, maxi, nready, client[SIZE];
  59. int fd,len;
  60. int a = 6666;
  61. struct sock_opts *ptr;
  62. ssize_t n;
  63. fd_set rset, allset;
  64. struct sockaddr_in servaddr, cliaddr;
  65. socklen_t clilen;
  66. char bufor[MAX], bufortmp[MAX], tmpchar, tabtmp[MAX];
  67. if((listenfd=socket(AF_INET, SOCK_STREAM, 0))<0)
  68. err_sys("Błąd otwierania socketa");
  69. bzero(&servaddr, sizeof(servaddr));
  70. servaddr.sin_family=AF_INET;
  71. servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  72. servaddr.sin_port = htons(50001);
  73. if(bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr))<0)
  74. err_sys("Błąd przybicia gniazda");
  75. if(listen(listenfd,LISTENQ)<0)
  76. err_sys("Błąd nasłuchu");
  77. maxfd = listenfd;
  78. maxi=-1;
  79. for(i=0; i<SIZE;i++)
  80. client[i] = -1;
  81. FD_ZERO(&allset);
  82. FD_SET(listenfd, &allset);
  83. while(1)
  84. {
  85. rset = allset;
  86. puts("Oczekiwanie na klienta, bądź dane");
  87. nready = select(maxfd+1, &rset, NULL,NULL,NULL);
  88. if(FD_ISSET(listenfd, &rset))
  89. {
  90. clilen = sizeof(cliaddr);
  91. connfd = accept(listenfd,(struct sockaddr *) &cliaddr, &clilen);
  92. for(i=0; i<SIZE;i++)
  93. if(client[i]<0)
  94. {
  95. client[i]=connfd;
  96. break;
  97. }
  98. if(i == SIZE)
  99. err_sys("za duzo klientow");
  100. FD_SET(connfd,&allset);
  101. if(connfd>maxfd)
  102. maxfd=connfd;
  103. if(i>maxi)
  104. maxi = i;
  105. if(--nready <= 0)
  106. continue;
  107. }
  108. for(i=0;i<=maxi;i++)
  109. {
  110. if((sockfd=client[i])<0)
  111. continue;
  112. if(FD_ISSET(sockfd, &rset))
  113. {
  114. if ((n=read(sockfd,bufor,MAX)) < 0)
  115. {
  116. perror("Błąd w odczycie");
  117. exit(-1);
  118. }
  119. if(bufor[0] == 'q')
  120. {
  121. close(sockfd);
  122. FD_CLR(sockfd,&allset);
  123. client[i]=-1;
  124. }
  125. else
  126. {
  127. puts("Wysłano do klienta");
  128. --n;
  129. write(sockfd, &n, sizeof(n));
  130. if(--nready<=0)
  131. break;
  132. } //end else
  133. } //end if
  134. } //end for
  135. fd = socket(AF_INET, SOCK_STREAM, 0);
  136. for (ptr = sock_opts; ptr->opt_str != NULL; ptr++)
  137. {
  138. printf("%s: ", ptr->opt_str);
  139. if (ptr->opt_val_str ==NULL)
  140. printf("(undefined)\n");
  141. else
  142. {
  143. len = sizeof(val);
  144. a = 32222222;
  145. if (setsockopt(fd, ptr->opt_level, ptr->opt_name, &val, a) == -1)
  146. {
  147. fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno));
  148. close (fd);
  149. }
  150. if (getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1)
  151. {
  152. err_sys("getsockopt error");
  153. }
  154. else
  155. {
  156. printf("default = %s\n", (*ptr->opt_val_str)(&val,len));
  157. }
  158. }
  159. }
  160. } //end for
  161. } //end main
  162.  
  163. Kod programy Klient:
  164. #include <arpa/inet.h>
  165. #include <stdio.h>
  166. #include <stdlib.h>
  167. #include <unistd.h>
  168. #include <errno.h>
  169. #include <sys/socket.h>
  170. #include <netinet/in.h>
  171. #include <string.h>
  172. #include <sys/types.h>
  173.  
  174. #define MAX_LINE 4096
  175.  
  176. int err (char*s)
  177. {
  178. printf("%s\n",s);
  179. printf("Errno:%d\n",errno);
  180. fprintf(stderr,"%s\n",strerror(errno));
  181. exit(-1);
  182. }
  183.  
  184. void wyslij (int sockfd,const char *c)
  185. {
  186. if (send(sockfd, c, strlen(c),MSG_NOSIGNAL)<=0)
  187. err("Błąd wysyłki");
  188. }
  189.  
  190. int main(int argc, char *argv[])
  191. {
  192. if (argc != 3)
  193. err("Format: ./klient adres_ip port");
  194. struct sockaddr_in adres_strukt;
  195. int sockfd = socket(AF_INET,SOCK_STREAM,0);
  196. bzero(&adres_strukt,sizeof(adres_strukt));
  197. adres_strukt.sin_family=AF_INET;
  198. if (inet_pton(AF_INET,argv[1],&adres_strukt.sin_addr)<0)
  199. err("Zly format adresu IP");
  200. if((adres_strukt.sin_port=htons(atoi(argv[2])))<0)
  201. err("Zly numer portu");
  202.  
  203. if (connect(sockfd,(struct sockaddr*)&adres_strukt,sizeof(struct sockaddr_in)) != 0)
  204. err("Błąd w połączeniu");
  205. char znaki[MAX_LINE];
  206. int liczba;
  207. while(1)
  208. {
  209. puts("Wprowadz komunikat");
  210. fgets(znaki,MAX_LINE,stdin);
  211. wyslij(sockfd,znaki);
  212. if (znaki[0] != 'q')
  213. {
  214. if (read(sockfd,&liczba,sizeof(int)) == -1)
  215. err("Błąd w odczycie");
  216. else
  217. printf("Liczba znakow: %d\n",liczba);
  218. }
  219. else
  220. {
  221. puts("Koniec");
  222. break;
  223. }
  224. }
  225. if (close(sockfd) == -1)
  226. err("Błąd zamykania");
  227. return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement