TCP/IP:基于c/s的简单通讯(c/c++实现)

1.任务

  1. 分别完成一个客户端和服务器端程序
  2. 客户端能够与服务器端进行简单的交互。

2.主要功能

  1. 客户端
    完成以下与服务器会话:
    登陆服务器端,实现和服务器的交互通信,直到输入bye。
  2. 服务器端
    接收客户端登录(注:下面的功能,用户登录后才能执行)
    接受客户端信息,并给出相应。
    直到接收到客户端的bye,结束通信。
  1. 要求
    采用基本的通讯模式完成。

—————————————————————————————————

参考C++:实现socket通信(TCP/IP)实例及其评论

(1)server端

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main() {
	//定义长度变量
	int send_len = 0;
	int recv_len = 0;
	int len = 0;
	//定义发送缓冲区和接受缓冲区
	char send_buf[100];
	char recv_buf[100];
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	SOCKET s_accept;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
	SOCKADDR_IN accept_addr;
	//打开
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;//结构体:拿到版本,版本校验 
	int err;
	err = WSAStartup(w_req, &wsadata);//查看是否打开成功
	if (err != 0) {
		cout << "打开失败!" << endl;
	}
	else {
		cout << "打开成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "版本正确!" << endl;
	}
	//填充服务端地址信息

	//填充服务端信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	server_addr.sin_port = htons(7777);
	//创建套接字
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "bind失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "bind成功!" << endl;
	}
	//监听
	if (listen(s_server, SOMAXCONN) < 0) {
		cout << "设置监听状态失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "设置监听状态成功!" << endl;
	}
	cout << "服务端正在监听连接,请稍候...." << endl;
	//接受连接请求
	len = sizeof(SOCKADDR);
	s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);
	if (s_accept == SOCKET_ERROR) {
		cout << "连接失败!" << endl;
		WSACleanup();
		return 0;
	}
	cout << "连接建立,准备接受数据" << endl;
	//接收数据
	while (1) {
		recv_len = recv(s_accept, recv_buf, 100, 0);
		if (recv_len < 0) {
			cout << "接受失败!" << endl;
			break;
		}
		else {
			if (recv_buf[0] == 'b' && recv_buf[1] == 'y' && recv_buf[2] == 'e'&& recv_buf[3]==NULL) {
				cout << "关闭客户端,byebye~" << endl;
				break;
			}
			cout << "客户端信息:" << recv_buf << endl;
		}
		cout << "请输入回复信息:";
		cin >> send_buf;
		send_len = send(s_accept, send_buf, 100, 0);
		if (send_len < 0) {
			cout << "发送失败!" << endl;
			break;
		}
	}
	//关闭套接字
	closesocket(s_server);
	closesocket(s_accept);
	//释放DLL资源
	WSACleanup();
	return 0;
}

在这里插入图片描述
(2)client端

#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main() {
	//定义长度变量
	int send_len = 0;
	int recv_len = 0;
	//定义发送缓冲区和接受缓冲区
	char send_buf[100];
	char recv_buf[100];
	//定义服务端套接字,接受请求套接字
	SOCKET s_server;
	//服务端地址客户端地址
	SOCKADDR_IN server_addr;
	//打开
	WORD w_req = MAKEWORD(2, 2);//版本号
	WSADATA wsadata;
	int err;
	err = WSAStartup(w_req, &wsadata);//查看是否打开成功 
	if (err != 0) {
		cout << "打开失败!" << endl;
	}
	else {
		cout << "打开成功!" << endl;
	}
	//检测版本号
	if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) {
		cout << "版本号不符!" << endl;
		WSACleanup();
	}
	else {
		cout << "版本正确!" << endl;
	}
	//绑定地址
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	server_addr.sin_port = htons(7777);//转换为小端存储
	//创建套接字
	s_server = socket(AF_INET, SOCK_STREAM, 0);
	if (connect(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {
		cout << "服务器连接失败!" << endl;
		WSACleanup();
	}
	else {
		cout << "服务器连接成功!" << endl;
	}

	//发送,接收数据
	while (1) {
		cout << "请输入发送信息:";
		cin >> send_buf;
		send_len = send(s_server, send_buf, 100, 0);
		if (send_len < 0) {
			cout << "发送失败!" << endl;
			break;
		}
		recv_len = recv(s_server, recv_buf, 100, 0);
		if (recv_len < 0) {
			cout << "接受失败!" << endl;
			break;
		}
		else {	
			if ( send_buf[0] == 'b' && send_buf[1] == 'y' && send_buf[2] == 'e'&&send_buf[3]==NULL) {
                cout << "关闭服务器端,byebye~" << endl;
				break;
			}
			cout << "服务端信息:" << recv_buf << endl;
		

		}

	}
	//关闭套接字
	closesocket(s_server);
	//释放DLL资源
	WSACleanup();
	return 0;
}

在这里插入图片描述

### 回答1: OPC通讯是一种基于标准接口的通讯方式,它是一种跨平台的解决方案。OPC通讯能够将数据在不同系统之间传输,使得不同的控制系统之间能够互联互通,从而实现了信息的共享和集成。 要实现PC与西门子S71200之间的OPC通讯,首先需要了解S71200的通讯协议以及OPC服务器的相关知识。由于OPC标准具有开放、通用的特点,因此可以使用任何第三方OPC服务器实现与S71200之间的通讯。在实际操作中,一般可以使用OPC Server连接S71200,然后通过OPC Client获取所需的数据。 在具体实现中,可以采用OPC Client/Server的方式进行通讯。在OPC Client端,需要通过程序来连接到OPC Server。一般使用COM接口连接,同时需要指定连接的OPC服务器的地址和端口号。在连接成功后,就可以通过OPC Client来读取或写入数据了。 在采集数据方面,需要设置OPC Group,指定采样的间隔时间和数据采集的周期。在采集数据完成后,可以将数据传输到PC端进行处理和分析。此外,还可以通过OPC服务器实现对S71200进行控制和监控。 综上所述,实现PC与西门子S71200之间的OPC通讯需要深入了解OPC标准和相关技术知识,并结合具体的应用场景进行实际操作。只有具备充分的专业知识和实践经验,才能确保OPC通讯的稳定性和可靠性。 ### 回答2: OPC通讯是一种应用广泛的工业自动化通信协议,可以方便地实现不同类型的设备和系统之间的数据传输。在与西门子S7-1200进行通讯时,需要使用OPC服务器和OPC客户端实现数据的交换。 在实现PC与S7-1200的OPC通讯时,需要以下步骤: 1.安装OPC服务器软件。选择合适的OPC服务器软件并按照说明进行安装和配置,确定要使用的OPC服务器与S7-1200的通讯协议和设置。 2.编写OPC服务器程序。根据OPC服务器软件提供的API接口,编写相应的程序代码,实现对S7-1200的读写操作。 3.安装OPC客户端软件。选择合适的OPC客户端软件并按照说明进行安装和配置,连接与OPC服务器的通讯端口。 4.编写OPC客户端程序。根据OPC客户端软件提供的API接口,编写相应的程序代码,实现PC与OPC服务器之间的数据交互操作。 5.测试和调试。在完成以上步骤后,进行测试和调试,检查各项参数设置是否正确,确保OPC通讯正常。如果有问题,需要进行调试和修改程序。 总的来说,实现PC与S7-1200的OPC通讯需要利用OPC服务器和OPC客户端软件,同时编写相应的程序代码并进行测试和调试。这样可以实现设备和系统之间的数据传输,提高工业自动化的效率和稳定性。 ### 回答3: OPC通讯是一种用于实现工业自动化设备之间数据交换的协议,它的优点是方便、快捷、安全、可靠等,被广泛应用于现代的工业控制系统中。 实现PC与西门子S71200之间的OPC通讯,需要采用相应的软件工具和通信协议。首先,需要安装一个OPC服务器软件,如Kepware、Softing、Matrikon等,这个软件可以提供与西门子S71200进行TCP/IP连接的功能。然后,使用相应的编程语言(如C/C++)编写OPC客户端程序,实现PC与OPC服务器之间的通讯。其中,需要注意的是编程中要注意数据类型、通讯协议等细节,确保数据的传输准确可靠。 在使用OPC通讯实现PC与西门子S71200之间的数据交换时,需要注意以下几点: 1.确保网络的稳定性。OPC数据传输需要在网络环境下进行,因此要保证网络的稳定可靠,避免数据传输出现丢包、延迟等情况。 2.选择恰当的通讯协议。TCP/IP是一种可靠的通讯协议,但其本身的开销比较大,所以需要根据实际情况选择适合的通讯协议进行数据传输。 3.检查数据传输的准确性。在数据传输过程中,需要检查数据的准确性,确保数据的传输正确无误。 通过以上方法,可以很好地实现PC与西门子S71200之间的OPC通讯,达到实现工业数据交换的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值