|
- #include "TCP_client.h"
-
-
-
- /*********************************************************************************************
- * 功能 : IP地址有效性检测
- * 描述 : 检测输入的IP地址是否合法
- * 输入 : IP 输入的IP地址
- * 输出 : true IP地址合法
- * false IP地址非法
- *********************************************************************************************/
- bool Check_IP(string ip)
- {
- int s[4];
- if (ip.length() < 7 || ip.length() > 15) //长度判定
- return false;
- if (sscanf_s(ip.c_str(), "%d.%d.%d.%d", &s[0], &s[1], &s[2], &s[3]) != 4) //IPV4格式正确
- {
- return false;
- }
- string newip = to_string(s[0]) + "." + to_string(s[1]) + "." + to_string(s[2]) + "." + to_string(s[3]);
- if (ip != newip) //前导0
- return false;
- if ((s[0] & 0xffffff00) || (s[1] & 0xffffff00) || (s[2] & 0xffffff00) || (s[3] & 0xffffff00)) //判断每一段大小是否符合要求
- {
- return false;
- }
- return true;
- }
-
- /*********************************************************************************************
- * 功能 : 获取从站IP地址和端口号
- * 描述 : 终端输入从站IP地址和端口号
- * 输入 : IP 地址 (IPV4)
- * *Port_number 端口号(1-65535)
- * 输出 : 无
- *********************************************************************************************/
- void Input_IP(string& ip, unsigned int *port_number)
- {
- int i = 1;
- do
- {
- if (i == 1)
- {
- cout << "请输入从站IP:";
- i = 0;
- }
- else
- cout << "IP地址格式不正确,请重新输入从站IP:";
- cin >> ip;
- } while (!Check_IP(ip));
-
- i = 1;
- cout << "IP地址输格式入正确,请输入从站端口号:";
- do
- {
- if (i != 1)
- cout << "请重新输入从站端口号:";
- cin >> *port_number;
- i = 0;
- } while (*port_number == 0 || *port_number > 65535); //端口不能为0 ,端口号范围1---65535
-
- }
- /*********************************************************************************************
- * 功能 : socket版本
- * 描述 : 启动socket服务
- * 输入 : 无
- * 输出 : true 启动成功
- * false 启动失败
- *********************************************************************************************/
- bool InitSocket_Version(void)
- {
- WORD sockVersion = MAKEWORD(2, 2);//使用winsocket2.2版本
- WSADATA wsaData;
- if (WSAStartup(sockVersion, &wsaData) != 0)
- {
- return false;
- }
- return true;
- }
-
- /*********************************************************************************************
- * 功能 : 初始化客户端
- * 描述 : 根据终端输入从站IP地址和端口号连接对应的服务器,设置超时时间
- * 输入 : 无
- * 输出 : ClientSocket 连接成功的套接字
- *********************************************************************************************/
- SOCKET Init_Client(void)
- {
- if (InitSocket_Version() == 0)
- {
- printf("启动Socket服务失败,请检查Socket版本");
- return INVALID_SOCKET;
- }
- string ip_address;
- unsigned int port_number;
- Input_IP(ip_address, &port_number);
- SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
- sockaddr_in serversock_in;
- serversock_in.sin_addr.S_un.S_addr = inet_addr(ip_address.c_str());
- serversock_in.sin_family = AF_INET;
- serversock_in.sin_port = htons(port_number);
- if (SOCKET_ERROR == connect(clientSocket, (SOCKADDR*)&serversock_in, sizeof(SOCKADDR)))
- {
- cout << "尝试连接TCP从站失败" << endl;
- return INVALID_SOCKET;
- }
- cout << "连接TCP从站成功" << endl;
- TIMEVAL timeout;
- timeout.tv_sec = 200; //ms
- timeout.tv_usec = 0; //us
- setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));//设置接收超时时间
- return clientSocket;
- }
-
- void Clear_buf(SOCKET clientSocket)
- {
- unsigned long bytesToRecv;
- char temp[500];
- do
- {
- ioctlsocket(clientSocket, FIONREAD, &bytesToRecv);
- if (bytesToRecv != 0)//不等于0时进行清理操作
- {
- if (bytesToRecv > 500)
- {
- recv(clientSocket, temp, 500, 0);
- }
- else
- recv(clientSocket, temp, bytesToRecv, 0);
- }
- } while (bytesToRecv != 0);
-
- }
-
- bool Send_date(SOCKET clientSocket, UINT8 *Request_Message, int request_message_len)
- {
- Clear_buf(clientSocket); //清理缓冲区
- int status = send(clientSocket, (char*)Request_Message, request_message_len, 0);
- if (status == (-1))
- {
- return false;
- }
- return true;
- }
-
- bool Abnormal_Connection(SOCKET *clientSocket)
- {
- printf("连接异常,请检查连接状态。\n");
- printf("**************************** Press Enter To Contioun ****************************\n");
- getchar();
- system("cls");
- closesocket(*clientSocket);
- WSACleanup();
- printf("是否重新连接服务器: 1 重新连接 0 关闭本软件\n");
- int flage = 0;
- do
- {
- cin >> flage;
- cin.clear();
- cin.sync();
- } while (!(flage == 0 || flage == 1));
- if (flage == 0)
- return false;
- system("cls");
- do
- {
- *clientSocket = Init_Client();
- } while (INVALID_SOCKET == *clientSocket);
- system("cls");
- return true;
- }
-
- int Recv_date(SOCKET clientSocket, UINT8 *Response_Message)
- {
- int Response_Message_len = recv(clientSocket, (char*)Response_Message, 600, 0);
- if (Response_Message_len > 0)
- {
- return Response_Message_len;
- }
- return 0;
- }
-
- bool Test_Connection_status(SOCKET clientSocket)
- {
- TIMEVAL timeout;
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- fd_set reads;
- FD_ZERO(&reads);
- FD_SET(clientSocket, &reads);
- if (select(0, &reads, 0, 0, &timeout))
- return false;
- else
- return true;
- }
|