Browse Source

完成输入IP和端口,连接从站,和从站通信

Modbus_TCP
zcn1123 4 years ago
parent
commit
60e3dd0084
5 changed files with 81 additions and 42 deletions
  1. +15
    -16
      Modbus_communication/Modbus_TCP/TCP_client.cpp
  2. +1
    -1
      Modbus_communication/Modbus_TCP/TCP_client.h
  3. +50
    -22
      Modbus_communication/Modbus_TCP/common.cpp
  4. +3
    -2
      Modbus_communication/Modbus_TCP/common.h
  5. +12
    -1
      Modbus_communication/Modbus_TCP/main.cpp

+ 15
- 16
Modbus_communication/Modbus_TCP/TCP_client.cpp View File

@@ -1,34 +1,33 @@
#include "TCP_client.h"

SOCKET Init_client(void)
SOCKET Init_client(string IP, unsigned int Port_number)
{
if (InitSocket_Version() == 0)
return INVALID_SOCKET;
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serversock_in;
serversock_in.sin_addr.S_un.S_addr = inet_addr("10.10.0.105");
serversock_in.sin_family = AF_INET;
serversock_in.sin_port = htons(3000);
if (SOCKET_ERROR == connect(clientSocket, (SOCKADDR*)&serversock_in, sizeof(SOCKADDR)))
SOCKET ClientSocket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in Serversock_in;
Serversock_in.sin_addr.S_un.S_addr = inet_addr(IP.c_str());
Serversock_in.sin_family = AF_INET;
Serversock_in.sin_port = htons(Port_number);
while (SOCKET_ERROR == connect(ClientSocket, (SOCKADDR*)&Serversock_in, sizeof(SOCKADDR)))
{
cout << "连接从站失败" << endl;
return INVALID_SOCKET;
cout << "尝试连接TCP从站失败" << endl;
}
return clientSocket;
cout << "连接TCP从站成功" << endl;
return ClientSocket;
}

int Tcp_client(void)
int Tcp_client(string IP, unsigned int Port_number)
{

SOCKET clientSocket = Init_client();
SOCKET clientSocket = Init_client(IP, Port_number);
if (INVALID_SOCKET == clientSocket)
{
cout << "初始化主站失败" << endl;
return 0;
return false;
}
while (true)
{
char receiveBuf[100];
char receiveBuf[260];
memset(receiveBuf, 0, 100);
recv(clientSocket, receiveBuf, 100, 0);
printf("%s\n", receiveBuf);
@@ -38,5 +37,5 @@ int Tcp_client(void)
closesocket(clientSocket);
//关闭服务
WSACleanup();
return 0;
return false;
}

+ 1
- 1
Modbus_communication/Modbus_TCP/TCP_client.h View File

@@ -3,6 +3,6 @@

#include "common.h"

int Tcp_client(void);
int Tcp_client(string IP, unsigned int Port_number);

#endif

+ 50
- 22
Modbus_communication/Modbus_TCP/common.cpp View File

@@ -1,9 +1,15 @@
#include "common.h"

#include "common.h"

/*********************************************************************************************
* 功能    : 检测socket版本
* �述   : 检测socket版本是�一致
* 输入 : 无
* 输出 : true socket版本一致
* false socket版本�一致
*********************************************************************************************/
bool InitSocket_Version(void)
{
WORD sockVersion = MAKEWORD(2, 2);//ʹÓÃwinsocket2.2°æ±¾
WORD sockVersion = MAKEWORD(2, 2);//使用winsocket2.2版本
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
@@ -12,41 +18,63 @@ bool InitSocket_Version(void)
return true;
}

bool Check_IP(char* IP)
/*********************************************************************************************
* 功能    : 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) //³¤¶ÈÅж¨
if (ip.length() < 7 || ip.length() > 15) //长度判定
return false;
if (sscanf_s(IP, "%d.%d.%d.%d", &s[0], &s[1], &s[2], &s[3]) != 4) //IPV4¸ñʽÕýÈ·
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
if (ip != newip) //�导0
return false;
if ((s[0] & 0xffffff00) || (s[1] & 0xffffff00) || (s[2] & 0xffffff00) || (s[3] & 0xffffff00)) //ÅжÏÿһ¶Î´óСÊÇ·ñ·ûºÏÒªÇó
if ((s[0] & 0xffffff00) || (s[1] & 0xffffff00) || (s[2] & 0xffffff00) || (s[3] & 0xffffff00)) //判断�一段大�是�符��求
{
return false;
}
return true;
}

void Input_IP(vector <string>& a)
/*********************************************************************************************
* 功能    : 获�从站IP地�和端��
* �述   : 终端输入从站IP地�和端��
* 输入 : IP 地� (IPV4)
* *Port_number 端��(1-65535)
* 输出 : 无
*********************************************************************************************/
void Input_IP(string& IP, unsigned int *Port_number)
{
cout << "ÇëÊäÈë´ÓÕ¾IP£º" << endl;
char IP[100];
while (cin >> IP) // ctrl + Z + Enter ½áÊøÊäÈë
int i = 1;
do
{
if (Check_IP(IP))
{
a.push_back(IP);
memset(IP, 0, 100);
}
else
if (i == 1)
{
cout << "ÊäÈëIP¸ñʽ´íÎó£¬ÇëÖØÐÂÊäÈë" << endl;
memset(IP, 0, 100);
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

}

+ 3
- 2
Modbus_communication/Modbus_TCP/common.h View File

@@ -10,8 +10,9 @@
#pragma comment(lib,"ws2_32.lib")
using namespace std;

bool InitSocket_Version(void);
bool Check_IP(char* IP);
void Input_IP(vector <string>& a);
bool InitSocket_Version(void);
void Input_IP(string& IP, unsigned int *Port_number);

#endif

+ 12
- 1
Modbus_communication/Modbus_TCP/main.cpp View File

@@ -1,9 +1,20 @@
#include "main.h"

string input()
{
string str;
cout << "请输入string内容:" << endl;
getline(cin, str, '\n');
cout << str << endl;
return str;
}

int main()
{

string IP;
unsigned int Port_number;
Input_IP(IP, &Port_number);
Tcp_client(IP, Port_number);
getchar();
return 0;
}

Loading…
Cancel
Save