最近在做嵌入式的project过程中,学习了winsock网络编程,project主要的内容是在移植到stm32之前通过c语言对整个过程进行模拟;过程包括:一台client端的设备和一台作为服务器端的sensor设备通过TCP协议进行连接,通过client端输入不同指令对sensor端进行控制: 下面是一些说明: 补充:project的完整源码已经update到gitee,后续的改进将逐步进行,大家感兴趣的话可以看看gitee连接 此处鸣谢一起完成project的负责单片机部分的王同学ImapBox个人空间,负责GUI部分的张同学和司马同学 sensor端文章链接:https://blog.csdn.net/capodexi/article/details/106801975 制作不易,感谢您的支持!
使用WINSOCK的网络通信模拟程序
(客户机端)
例如start命令唤醒sensor;
唤醒后输入任意指令获得sensor端返回的温度数值(此处为随机数生成);
唤醒后输入quit退出连接,结束模拟过程。
1.client端作为客户机,代码分为通讯模块、控制模块。
2.考虑到TCP协议通过三次握手进行连接,有助于保证sensor端和client端通信的稳定性,我们使用TCP通信替代了推荐的UDP通信,因此代码部分中大规模的代码是通讯模块。
3.控制模块是对sensor端的回传数据进行鉴别(实际上就是判断回传数值的范围,因为project比较简单,此处只设置了一个分级)
4.sensor端回传的温度数值在此代码中只是通过随机数生成的35.0-42.9之间的数值,在单片机开发板版本中为通过温度传感器检测到的实际数值。
此部分为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: %sn", buf);//接受服务器回传数据 if ((buf[0] == '3' && buf[1] > '6') || buf[0] == '4') { printf("WARNING! Abnormal temperature, please checkn "); } //温度检测,若超过37则报警 if (strcmp(buf, "quit") == 0) { printf("quit! n"); break; } } //服务器与客户端通信部分 closesocket(sHost); WSACleanup(); system("pause"); return 0; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算