#include "common.h" /********************************************************************************************* * 功能    : 检测socket版本 * 描述   : 检测socket版本是否一致 * 输入 : 无 * 输出 : true socket版本一致 * false socket版本不一致 *********************************************************************************************/ bool InitSocket_Version(void) { WORD sockVersion = MAKEWORD(2, 2);//使用winsocket2.2版本 WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) { return false; } return true; } /********************************************************************************************* * 功能    : IP地址有效性检测 * 描述   : 检测输入的IP地址是否合法 * 输入 : IP 输入的IP地址 * 输出 : true IP地址合法 * false IP地址非法 *********************************************************************************************/ bool Check_IP(string IP) { int s[4]; string ip = IP; 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 ,端口号范围0---65535 } /********************************************************************************************* * 功能    : 选择功能码 * 描述   : 在功能码 0x01 0x03 0x0F 0x10中选择一个功能码 * 输入 : 无 * 输出 : Function_code 选择的功能码 *********************************************************************************************/ int Input_Function_code(void) { int Function_code; cin >> hex; int i = 1; printf("功能码 : 0x01 0x03 0x0F 0x10 \n"); printf("说明 : 读线圈 读寄存器 写多个线圈 写多个寄存器\n"); do { if (i == 1) { i = 0; cout << "请输入选择的功能码:"; } else cout << "输入功能码错误,请重新选择的功能码"; cin >> Function_code; cin.clear(); cin.sync(); } while (Function_code != 0x01 && Function_code != 0x03 && Function_code != 0x0F && Function_code != 0x10); return Function_code; } /********************************************************************************************* * 功能    : 输入操作起始地址码 * 描述   : 起始地址码,最大值65535 * 输入 : 无 * 输出 : Starting_address 操作起始地址码 *********************************************************************************************/ unsigned int Input_Starting_address(void) { unsigned int Starting_address; int i = 1; printf("请输入操作(十进制)起始地址 \n"); do { if (i == 1) { i = 0; cout << "请输入操作(十进制)起始地址:"; } else cout << "请重新输入操作(十进制)起始地址"; cin >> Starting_address; cin.clear(); cin.sync(); } while (Starting_address > 65535 || Starting_address < 0); return Starting_address; } /********************************************************************************************* * 功能    : 输入操作数量 * 描述   : 操作数量,0x01 1-200 0x03 1-125 0x0xF 1-1968 0x10 1-123 * 输入 : Function_code 选择的功能码类型 * 输出 : Operations_Number 对应功能码类型的操作数量 *********************************************************************************************/ unsigned int Input_Operations_Number(int Function_code) { unsigned int Operations_Number; int i = 1; bool flage = true; printf(" 功能码 0x01 0x03 0x0F 0x10\n"); printf("操作数量 1-2000 1-125 1-1968 1-123\n"); do { if (i == 1) { i = 0; cout << "请输入操作(十进制)数量:"; } else cout << "请重新输入操作(十进制)数量"; cin >> Operations_Number; cin.clear(); cin.sync(); if (Function_code == 0x01 && Operations_Number >= 1 && Operations_Number <= 2000) flage = false; if (Function_code == 0x03 && Operations_Number >= 1 && Operations_Number <= 125) flage = false; if (Function_code == 0x0F && Operations_Number >= 1 && Operations_Number <= 1968) flage = false; if (Function_code == 0x10 && Operations_Number >= 1 && Operations_Number <= 123) flage = false; } while (flage); return Operations_Number; }