Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*-------------------------------------------------------------------------------------
- TCP Client
- Каждый вызов socket() должен иметь соответствующий вызов close()
- ------------------------------------------------------------------------------------*/
- #include <stdio.h>
- #include <conio.h>
- #include "socket.h"
- #include "utils.h"
- #include <stdlib.h>
- #include <mem.h>
- #include "clocks.h"
- #include <string.h>
- SOCKET Soc;
- int GDebug=1;
- char buf[256];
- struct sockaddr_in serveraddr;
- cClock clc;
- char hostname[64];
- int UnBlock(unsigned long unblock)//1-не блокирующий
- {
- if(unblock)tps("unblock"); else tps("block");
- if(ioctlsocket(Soc, FIONBIO, &unblock))
- {
- tps("ioctl"); tp(errno);
- return ERR;
- }
- return OK;
- }
- int InitClient() //char *hostname)
- {
- tps("inic"); tps(hostname); int re=0;
- if ((Soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) //PF_INET
- {
- tps("soc"); tp(errno);
- return ERR;
- }
- UnBlock(1); //h_WDT(OFF);
- memset(&serveraddr, 0, sizeof(struct sockaddr_in));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(5510);
- struct hostent *hst;
- // преобразование IP адреса
- if (inet_addr(hostname)!=INADDR_NONE)
- {
- tps("a1"); serveraddr.sin_addr.s_addr=inet_addr(hostname);
- }
- else
- // попытка получить IP адрес по доменному имени сервера
- if (hst=gethostbyname(hostname))
- {
- tps("a2");
- // hst->h_addr_list содержит не массив адресов, а массив указателей на адреса
- ((unsigned long *)&serveraddr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
- }
- else
- {
- printf("\n\rInvalid address %s\n",hostname); //wdt!
- closesocket(Soc);
- return -1;
- }
- tp(serveraddr.sin_addr.s_addr);PN
- tps("conn");
- re=connect(Soc, (struct sockaddr *) &serveraddr, sizeof(struct sockaddr_in));
- if(re || errno)
- {
- tp(re); tp(errno);
- //getch();
- }
- return 1;
- }
- void Rx()
- {
- tps("rx");
- int RxBytes=recv(Soc, buf, 255, 0); //-1 ?из примера - здесь т.к. нужно очищать buf при ожидании линии (теоретически возм. переполнение и креш)
- //if (RxBytes == SOCKET_ERROR)
- tp(RxBytes);
- }
- void Tx(char* buf, int len)
- {
- tps("tx");
- int re=send(Soc, buf, len, 0);
- if(re == SOCKET_ERROR)tp(errno);
- }
- /*-------------------------------------------------------------------------------------
- stopped {sel}{3}{ROK}{WOK}{SE}
- run srv {sel}{1}{WOK}
- ------------------------------------------------------------------------------------*/
- int Sel()
- {
- int re=0;
- tps("sel");
- fd_set setR, setW, setE;
- FD_ZERO(&setW); FD_SET(Soc, &setW);
- FD_ZERO(&setE); FD_SET(Soc, &setE);
- //FD_ZERO(&setR); FD_SET(Soc, &setR);
- timeval time_out;
- time_out.tv_sec = 2;
- time_out.tv_usec = 0; //200000; //0.2s
- re=select(1, NULL, &setW, &setE, &time_out); //re=select(1, &setR, &setW, &setE, &time_out);
- tp(re);
- if(re<0)
- {
- tp(errno); //getch();
- return 0;
- }
- if (FD_ISSET(Soc, &setE))
- {
- tps("SE"); // Соединиться не удалось
- //FD_CLR(Soc, &setE);
- return -1;
- }else
- if (FD_ISSET(Soc, &setW))
- {
- tps("WOK"); // Connect выполнен успешно
- //Tx(buf,11);
- //FD_CLR(Soc, &setW);
- }
- else tps("TO"); // произошел таймаут (5 секунд)
- //if (FD_ISSET(Soc, &setR))
- //{
- // tps("ROK");
- // FD_CLR(Soc, &setR);
- //// Rx();
- return 0;
- }
- int Processing()
- {
- }
- void Close()
- {
- tps("closesoc");
- //tp(shutdown(Soc,2)); //нет эффекта, сервер не видит отключение
- UnBlock(0);
- tp(closesocket(Soc));
- }
- int term()
- {
- if(kbhit())
- {
- char c=getch();
- if(c=='c')return 2;
- return 1;
- }
- return 0;
- }
- int main(int argc, char** argv)
- {
- if(argc>1)strcpy(hostname,argv[1]);
- else strcpy(hostname,"iao-vladimir");
- InitClient();
- //InitClient("172.16.101.38");
- //InitClient("iao-vladimir");
- //InitClient("yandex.ru");
- //InitClient("10.8.0.10");
- clc.Res();
- while(1)
- {
- int t=term();
- if(t)
- {
- if(t==1)break;
- else
- {
- clc.Res(); Close(); InitClient();
- }
- }
- if(clc.GetMS()<1000)continue;
- clc.Res();
- PN
- if(Sel()<0)InitClient();
- }
- Close();
- return 0;
Add Comment
Please, Sign In to add comment