Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.56 KB | None | 0 0
  1. client
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <arpa/inet.h>
  10. #include <pthread.h>
  11. void *recvmg(void *sock)
  12. {
  13. int their_sock = *((int *)sock);
  14. char msg[500];
  15. int len;
  16. while((len = recv(their_sock,msg,500,0)) > 0) {
  17. msg[len] = '\0';
  18. printf("%s\n",msg);
  19. memset(msg,'\0',sizeof(msg));
  20. }
  21. }
  22. int main(int argc, char *argv[])
  23. {
  24. struct sockaddr_in their_addr;
  25. int my_sock;
  26. int their_sock;
  27. int their_addr_size;
  28. int portno;
  29. pthread_t sendt,recvt;
  30. char msg[500];
  31. char username[100];
  32. char res[600];
  33. char ip[INET_ADDRSTRLEN];
  34. int len;
  35.  
  36. if(argc > 3) {
  37. printf("too many arguments");
  38. exit(1);
  39. }
  40. portno = atoi(argv[2]);
  41. strcpy(username,argv[1]);
  42. my_sock = socket(AF_INET,SOCK_STREAM,0);
  43. memset(their_addr.sin_zero,'\0',sizeof(their_addr.sin_zero));
  44. their_addr.sin_family = AF_INET;
  45. their_addr.sin_port = htons(portno);
  46. their_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  47.  
  48. if(connect(my_sock,(struct sockaddr *)&their_addr,sizeof(their_addr)) < 0) {
  49. perror("connection not esatablished");
  50. exit(1);
  51. }
  52. inet_ntop(AF_INET, (struct sockaddr *)&their_addr, ip, INET_ADDRSTRLEN);
  53. printf("connected to %s, start chatting\n",ip);
  54. pthread_create(&recvt,NULL,recvmg,&my_sock);
  55. while(fgets(msg,500,stdin) > 0) {
  56. // strcpy(res,username);
  57. // strcat(res,":");
  58. strcat(res,msg);
  59. len = write(my_sock,res,strlen(res));
  60. if(len < 0) {
  61. perror("message not sent");
  62. exit(1);
  63. }
  64. memset(msg,'\0',sizeof(msg));
  65. memset(res,'\0',sizeof(res));
  66. }
  67. pthread_join(recvt,NULL);
  68. close(my_sock);
  69.  
  70. }
  71.  
  72. ------------------------------------------
  73. -------------------------------------------------
  74. ---------------------
  75. serwer
  76. #include <sys/types.h>
  77. #include <sys/socket.h>
  78. #include <netinet/in.h>
  79. #include <stdio.h>
  80. #include <string.h>
  81. #include <stdlib.h>
  82. #include <unistd.h>
  83. #include <arpa/inet.h>
  84. #include <pthread.h>
  85. #include <string.h>
  86. #include <math.h>
  87. #include <time.h>
  88. #include <stdbool.h>
  89. struct client_info {
  90. int sockno;
  91. char ip[INET_ADDRSTRLEN];
  92. };
  93. struct tm * timeinfo;
  94. char buffer[32];
  95. time_t timet;
  96. //obsluga max 100 klientow
  97. int clients[100];
  98. int n = 0;
  99. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  100. char string[100];
  101. double client_sqrt;
  102. int isdigit=0;
  103.  
  104. void sqrt_char(char *number){
  105.  
  106. client_sqrt= sqrt(atoi(number));
  107. }
  108.  
  109. void date_time(){
  110.  
  111. time(&timet);
  112. timeinfo=localtime(&timet);
  113. strftime(buffer , 32 , "_%Y_%m_%d_%H_%M" , timeinfo);
  114. }
  115.  
  116.  
  117. //to bardzo proste po prostu wysylanie z czatu(msg = nick: wiadomosc). latwo przerobic na komunikacja klient-serwer
  118. void sendtoall(char *msg,int curr)
  119. {
  120. int i=0;
  121. int c=0;
  122. int isdigit=0;
  123.  
  124.  
  125.  
  126.  
  127. if(strcmp(msg,"data\n") == 0)
  128. {
  129. date_time();
  130. strcpy(msg,buffer);
  131. }
  132.  
  133. while(c<strlen(msg)-1 && isdigit ==0)
  134. {
  135.  
  136. if(msg[c]>= '0' && msg[c] <='9')
  137. isdigit=0;
  138. else
  139. isdigit=1;
  140. c++;
  141.  
  142. }
  143.  
  144.  
  145. if(isdigit==0)
  146. {
  147. sqrt_char(msg);
  148. sprintf(msg,"%lf",client_sqrt);
  149. //*(double*)msg=client_sqrt;
  150.  
  151. }
  152.  
  153.  
  154. pthread_mutex_lock(&mutex);
  155.  
  156.  
  157. for(i = 0; i < n; i++) {
  158.  
  159. if(clients[i] == curr)
  160. {
  161. if(send(clients[i],msg,strlen(msg),0) < 0) {
  162. perror("sending failure");
  163. continue;
  164. }
  165. }
  166.  
  167.  
  168. }
  169.  
  170. pthread_mutex_unlock(&mutex);
  171.  
  172. }
  173. void *recvmg(void *sock)
  174. {
  175. struct client_info cl = *((struct client_info *)sock);
  176. char msg[500];
  177. int len;
  178. int i;
  179. int j;
  180.  
  181. //rec zwraca ilość bajtów odczytanych ze żródła rec(gniazdo,bufr_zapisu, wielkosc bufora, flaga - nie powiedzial do czego była ;c )
  182. while((len = recv(cl.sockno,msg,500,0)) > 0) {
  183. msg[len] = '\0';
  184. sendtoall(msg,cl.sockno);
  185. memset(msg,'\0',sizeof(msg));
  186. }
  187. pthread_mutex_lock(&mutex);
  188. //odlaczenie klienta + przepisanie klientów żeby nie było adresu tego co poszedł
  189. printf("%s disconnected\n",cl.ip);
  190. for(i = 0; i < n; i++) {
  191. if(clients[i] == cl.sockno) {
  192. j = i;
  193. while(j < n-1) {
  194. clients[j] = clients[j+1];
  195. j++;
  196. }
  197. }
  198. }
  199. n--;
  200. pthread_mutex_unlock(&mutex);
  201. }
  202. int main(int argc,char *argv[])
  203. {
  204.  
  205. /*
  206. struct sockaddr_in{
  207. sa_family_t - zawsze sutawione na AF_INET , adresy IP i numery portów
  208. in_port_t - port komunikacji
  209. sin_addr - ip hosta
  210. sin_zero[8] - tego nie ma nanwet w dokumentacji linuxa xD
  211. }
  212. */
  213.  
  214. struct sockaddr_in my_addr,their_addr;
  215. int my_sock;
  216. int their_sock;
  217. socklen_t their_addr_size;
  218. int portno; //port serwera
  219. pthread_t sendt,recvt;
  220. char msg[500];
  221. int len;
  222.  
  223. /*
  224. struct client_info {
  225. int descriptor- gniazdo klienta
  226. address - struktura socketaddr_in dla klienta
  227. }
  228. */
  229.  
  230.  
  231. struct client_info cl;
  232. char ip[INET_ADDRSTRLEN];;
  233. ;
  234.  
  235. if(argc > 2) {
  236. printf("too many arguments");
  237. exit(1);
  238. }
  239.  
  240. portno = atoi(argv[1]);
  241. //gniazdo dla tcp
  242. my_sock = socket(AF_INET,SOCK_STREAM,0);
  243. // dla udp : my_sock = socket(AF_INET,SOCK_DGRAM,0);
  244. memset(my_addr.sin_zero,'\0',sizeof(my_addr.sin_zero));
  245. my_addr.sin_family = AF_INET;
  246. //zamiana na kolejnosc bajtow sieciowych z kolejnosci hosta
  247. my_addr.sin_port = htons(portno);
  248. //inet_add konweruje z adresu w normalnej notacji na binarna
  249. my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  250.  
  251. their_addr_size = sizeof(their_addr);
  252. /*bind(1,2,3) - przypisuje nazwę do gniazda tak było na wykładzie powiedziane
  253. 1- gniazdo
  254. 2- adres na kktó©y wskazuje
  255. 3- okreslony w bajtach rozmiar struktury adresu
  256. */
  257. if(bind(my_sock,(struct sockaddr *)&my_addr,sizeof(my_addr)) != 0) {
  258. perror("binding unsuccessful");
  259. exit(1);
  260. }
  261.  
  262. //listen - nasłuch okreslajacy gniazdo nasłuchu i maksymala dlugosc kolejki . jak kolejka jest pełna to wywala bład enconnrefused. dla retransmisji moze zignoworwac polaczenie i sprobowac nawiazac potem
  263. if(listen(my_sock,5) != 0) {
  264. perror("listening unsuccessful");
  265. exit(1);
  266. }
  267.  
  268. //accept - tworzy połączenie i zwraca deskryptor dla tego gniazda
  269. while(1) {
  270. if((their_sock = accept(my_sock,(struct sockaddr *)&their_addr,&their_addr_size)) < 0) {
  271. perror("accept unsuccessful");
  272. exit(1);
  273. }
  274.  
  275. pthread_mutex_lock(&mutex);
  276. //konwersja adresu sieciowegodo char[]. cos takiego
  277. inet_ntop(AF_INET, (struct sockaddr *)&their_addr, ip, INET_ADDRSTRLEN);
  278. printf("%s connected\n",ip);
  279. cl.sockno = their_sock;
  280. strcpy(cl.ip,ip);
  281. clients[n] = their_sock;
  282. n++;
  283. pthread_create(&recvt,NULL,recvmg,&cl);
  284. pthread_mutex_unlock(&mutex);
  285. }
  286. return 0;
  287. }
  288. //na tym wykładzie był też przyponiane o tych mutexach ze te lock blokuje a unlock zwalnia zasoby teg watku
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement