Guest User

Untitled

a guest
Jul 16th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.36 KB | None | 0 0
  1. /*-------------------------------------------------------------------------------------
  2. TCP Client
  3. Каждый вызов socket() должен иметь соответствующий вызов close()
  4. ------------------------------------------------------------------------------------*/
  5. #include <stdio.h>
  6. #include <conio.h>
  7. #include "socket.h"
  8. #include "utils.h"
  9. #include <stdlib.h>
  10. #include <mem.h>
  11. #include "clocks.h"
  12. #include <string.h>
  13.  
  14. SOCKET Soc;
  15. int GDebug=1;
  16. char buf[256];
  17. struct sockaddr_in serveraddr;
  18. cClock clc;
  19. char hostname[64];
  20.  
  21. int UnBlock(unsigned long unblock)//1-не блокирующий
  22. {
  23.     if(unblock)tps("unblock"); else tps("block");
  24.     if(ioctlsocket(Soc, FIONBIO, &unblock))
  25.     {
  26.         tps("ioctl"); tp(errno);
  27.         return ERR;
  28.     }
  29.     return OK;
  30. }
  31.  
  32. int InitClient() //char *hostname)
  33. {
  34.     tps("inic"); tps(hostname); int re=0;
  35.     if ((Soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) //PF_INET
  36.     {
  37.         tps("soc"); tp(errno);
  38.         return ERR;
  39.     }
  40.     UnBlock(1); //h_WDT(OFF);
  41.    
  42.     memset(&serveraddr, 0, sizeof(struct sockaddr_in));
  43.     serveraddr.sin_family = AF_INET;
  44.     serveraddr.sin_port = htons(5510);
  45.     struct hostent *hst;
  46.      // преобразование IP адреса
  47.     if (inet_addr(hostname)!=INADDR_NONE)
  48.     {
  49.         tps("a1"); serveraddr.sin_addr.s_addr=inet_addr(hostname);
  50.     }
  51.     else
  52.         // попытка получить IP адрес по доменному имени сервера
  53.         if (hst=gethostbyname(hostname))
  54.         {
  55.             tps("a2");
  56.             // hst->h_addr_list содержит не массив адресов, а массив указателей на адреса
  57.             ((unsigned long *)&serveraddr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
  58.         }
  59.       else
  60.       {
  61.         printf("\n\rInvalid address %s\n",hostname);    //wdt!
  62.         closesocket(Soc);
  63.         return -1;
  64.       }
  65.     tp(serveraddr.sin_addr.s_addr);PN
  66.  
  67.     tps("conn");
  68.     re=connect(Soc, (struct sockaddr *) &serveraddr, sizeof(struct sockaddr_in));
  69.     if(re || errno)
  70.     {
  71.         tp(re); tp(errno);
  72.         //getch();
  73.     }
  74.     return 1;
  75. }
  76.  
  77. void Rx()
  78. {
  79.     tps("rx");
  80.     int RxBytes=recv(Soc, buf, 255, 0); //-1 ?из примера - здесь т.к. нужно очищать buf при ожидании линии (теоретически возм. переполнение и креш)
  81.     //if (RxBytes == SOCKET_ERROR)
  82.     tp(RxBytes);
  83. }
  84. void Tx(char* buf, int len)
  85. {
  86.     tps("tx");
  87.     int re=send(Soc, buf, len, 0);
  88.     if(re == SOCKET_ERROR)tp(errno);
  89. }
  90.  
  91. /*-------------------------------------------------------------------------------------
  92. stopped     {sel}{3}{ROK}{WOK}{SE}
  93. run srv     {sel}{1}{WOK}
  94. ------------------------------------------------------------------------------------*/
  95. int Sel()
  96. {
  97.     int re=0;
  98.     tps("sel");
  99.     fd_set setR, setW, setE;
  100.     FD_ZERO(&setW); FD_SET(Soc, &setW);
  101.     FD_ZERO(&setE); FD_SET(Soc, &setE);
  102.     //FD_ZERO(&setR);   FD_SET(Soc, &setR);
  103.     timeval time_out;
  104.     time_out.tv_sec = 2;
  105.     time_out.tv_usec = 0; //200000; //0.2s
  106.     re=select(1, NULL, &setW, &setE, &time_out);    //re=select(1, &setR, &setW, &setE, &time_out);
  107.     tp(re);
  108.     if(re<0)
  109.     {
  110.         tp(errno); //getch();
  111.         return 0;
  112.     }
  113.     if (FD_ISSET(Soc, &setE))
  114.     {
  115.         tps("SE");  // Соединиться не удалось
  116.         //FD_CLR(Soc, &setE);
  117.         return -1;
  118.     }else
  119.     if (FD_ISSET(Soc, &setW))
  120.     {
  121.         tps("WOK"); // Connect выполнен успешно
  122.         //Tx(buf,11);
  123.         //FD_CLR(Soc, &setW);
  124.     }
  125.     else tps("TO"); // произошел таймаут (5 секунд)
  126.    
  127.     //if (FD_ISSET(Soc, &setR))
  128.     //{
  129.     //  tps("ROK");
  130.     //  FD_CLR(Soc, &setR);
  131.     ////    Rx();
  132.     return 0;
  133. }
  134.  
  135. int Processing()
  136. {
  137.  
  138. }
  139.  
  140. void Close()
  141. {
  142.     tps("closesoc");
  143.     //tp(shutdown(Soc,2));  //нет эффекта, сервер не видит отключение
  144.     UnBlock(0);
  145.     tp(closesocket(Soc));
  146. }
  147. int term()
  148. {
  149.     if(kbhit())
  150.     {
  151.         char c=getch();
  152.         if(c=='c')return 2;
  153.         return 1;
  154.     }
  155.     return 0;
  156. }
  157. int main(int argc, char** argv)
  158. {
  159.     if(argc>1)strcpy(hostname,argv[1]);
  160.     else strcpy(hostname,"iao-vladimir");
  161.     InitClient();
  162.     //InitClient("172.16.101.38");
  163.     //InitClient("iao-vladimir");
  164.     //InitClient("yandex.ru");
  165.     //InitClient("10.8.0.10");
  166.     clc.Res();
  167.     while(1)
  168.     {
  169.         int t=term();
  170.         if(t)
  171.         {
  172.             if(t==1)break;
  173.             else
  174.             {
  175.                 clc.Res(); Close(); InitClient();
  176.             }
  177.         }
  178.         if(clc.GetMS()<1000)continue;
  179.         clc.Res();
  180.         PN
  181.         if(Sel()<0)InitClient();
  182.     }
  183.     Close();
  184.     return 0;
Add Comment
Please, Sign In to add comment