ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用WINSOCK的网络通信模拟程序 (客户机端)

2020-06-18 11:36:56  阅读:338  来源: 互联网

标签:sHost buf 客户机 retVal servAddr 模拟程序 printf sensor WINSOCK


使用WINSOCK的网络通信模拟程序

(客户机端)

最近在做嵌入式的project过程中,学习了winsock网络编程,project主要的内容是在移植到stm32之前通过c语言对整个过程进行模拟;过程包括:一台client端的设备和一台作为服务器端的sensor设备通过TCP协议进行连接,通过client端输入不同指令对sensor端进行控制:
例如start命令唤醒sensor;
唤醒后输入任意指令获得sensor端返回的温度数值(此处为随机数生成);
唤醒后输入quit退出连接,结束模拟过程。

下面是一些说明:
1.client端作为客户机,代码分为通讯模块、控制模块。
2.考虑到TCP协议通过三次握手进行连接,有助于保证sensor端和client端通信的稳定性,我们使用TCP通信替代了推荐的UDP通信,因此代码部分中大规模的代码是通讯模块。
3.控制模块是对sensor端的回传数据进行鉴别(实际上就是判断回传数值的范围,因为project比较简单,此处只设置了一个分级)
4.sensor端回传的温度数值在此代码中只是通过随机数生成的35.0-42.9之间的数值,在单片机开发板版本中为通过温度传感器检测到的实际数值。

补充:project的完整源码已经update到gitee,后续的改进将逐步进行,大家感兴趣的话可以看看gitee连接

此处鸣谢一起完成project的负责单片机部分的王同学CSDN个人空间,负责GUI部分的张同学和司马同学

sensor端文章链接:https://blog.csdn.net/capodexi/article/details/106801975
此部分为client端源码

#include "stdio.h"
#include<WINSOCK2.h>
#include<string>
#include<iostream>
#include<tchar.h>
#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE 64
//设置头文件,库文件与常量(缓冲区大小)

int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsd;
	SOCKET sHost;
	SOCKADDR_IN servAddr;
	char buf[BUF_SIZE];
	int retVal;
	//声明程序所需的变量

	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
	{
		printf("WSAStartup failed! \n");
		return 1;
	}
	//初始化Socket环境

	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sHost)
	{
		printf("socket failed! \n");
		WSACleanup();
		return -1;
	}
	//创建client端的Socket

	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.110.117");
	servAddr.sin_port = htons(9990);
	int sServerAddlen = sizeof(servAddr);
	//设置服务器socket地址

	retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
	if (retVal == SOCKET_ERROR)
	{
		printf("connect failed!\n");
		closesocket(sHost);
		WSACleanup();
		return -1;
	}
	//连接到服务器

	while (1)
	{
		printf("请输入传递给服务器端的信息:");
		std::string str; //向服务器端发送数据
		std::getline(std::cin, str);
		ZeroMemory(buf, BUF_SIZE);
		strcpy(buf, str.c_str());//将输入的数据复制到buf区域
		retVal = send(sHost, buf, strlen(buf), 0);
		if (SOCKET_ERROR == retVal)
		{
			printf("send failed! \n");
			closesocket(sHost);
			WSACleanup();
			return -1;
		}//send 函数debug
		retVal = recv(sHost, buf, sizeof(buf)+1, 0);
		printf("Recv From Server: %s\n", buf);//接受服务器回传数据
		if ((buf[0] == '3' && buf[1] > '6') || buf[0] == '4')
		{
			printf("WARNING! Abnormal temperature, please check\n ");
		}
		//温度检测,若超过37则报警
		if (strcmp(buf, "quit") == 0)
		{
			printf("quit! \n");
			break;
		}
	}
	//服务器与客户端通信部分

	closesocket(sHost);
	WSACleanup();
	system("pause");
	return 0;
}


制作不易,感谢您的点赞支持!

标签:sHost,buf,客户机,retVal,servAddr,模拟程序,printf,sensor,WINSOCK
来源: https://blog.csdn.net/capodexi/article/details/106802557

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有