#define _CRT_SECURE_NO_WARNINGS
#include "TCPserver.h"
#include "UserTime.h"
#include <iostream>
#include <string>
//#include<functional>
using namespace std;
//using namespace std;
//#include <thread>
CTCPserver::CTCPserver()
{
}
CTCPserver::~CTCPserver()
{
CloseSocket();
}
void CTCPserver::TcpReturnFun(void* contex)
{
CTCPserver* b_CTCPclient = (CTCPserver*)contex;
if (b_CTCPclient == NULL)
{
b_CTCPclient->m_Error = -1;
return;
}
UserTime b_UserTime;
int b_UserTimeId = 0;
b_UserTime.ResetData();
for (;;)//这个效果好
{
if (!b_CTCPclient->isClientSockConnect)
{
// 【5】等待客户端连接
b_CTCPclient->isClientSockConnect = b_CTCPclient->waitClientConnect(b_CTCPclient->listenScok, b_CTCPclient->clientSock);
if (!b_CTCPclient->isClientSockConnect)
{
b_UserTimeId = -1;
Sleep(1);//休眠10毫秒秒
if (b_UserTime.TimeOutStart(true, b_CTCPclient->m_OverTime))
{
b_CTCPclient->m_Error = -5;
b_CTCPclient->m_ErrorName = "等待客户端连接超时!";
CSocketFater::registHeightCallbackErr(b_CTCPclient->ExternSocketFunErr, b_CTCPclient->m_ErrorName, b_CTCPclient->c_ExternReturnDataErr); //回调函数调用
b_UserTime.ResetData();
}
continue;
}
else
{
sprintf(b_CTCPclient->m_ErrorName, "%ld", b_CTCPclient->clientSock);
strcat(b_CTCPclient->m_ErrorName, "客户端连接成功!");
CSocketFater::registHeightCallbackErr(b_CTCPclient->ExternSocketFunErr, b_CTCPclient->m_ErrorName, b_CTCPclient->c_ExternReturnDataErr); //回调函数调用
b_UserTime.ResetData();
}
}
if (!b_CTCPclient->isReceiveData)
{
// 【6】接收数据-阻塞
b_CTCPclient->isReceiveData = b_CTCPclient->receiveData(b_CTCPclient->clientSock, &b_CTCPclient->m_Buffdata);
// 如果接收数据失败则断开
if (!b_CTCPclient->isReceiveData)
{
// 【7】停止套接字的接收、发送
b_CTCPclient->shutdownSocket(b_CTCPclient->clientSock);
cout << "等待客户端再连接..." << endl;
b_CTCPclient->isClientSockConnect = false; // 可以重连了
b_CTCPclient->m_Error = -5;
sprintf(b_CTCPclient->m_ErrorName, "%ld", b_CTCPclient->clientSock);
strcat(b_CTCPclient->m_ErrorName, "客户端断开!");
CSocketFater::registHeightCallbackErr(b_CTCPclient->ExternSocketFunErr, b_CTCPclient->m_ErrorName, b_CTCPclient->c_ExternReturnDataErr); //回调函数调用
b_UserTime.ResetData();
}
else
{
//返回接受数据
CSocketFater::registHeightCallback(b_CTCPclient->ExternSocketFun, b_CTCPclient->m_Buffdata, b_CTCPclient->c_ExternReturnData); //回调函数调用
b_CTCPclient->isReceiveData = false;
}
//if (isReceiveData && data != "jfzpoi" && data != "@end#")
//{
// isReceiveData = false;
//}
//if (isReceiveData && data == "jfzpoi")
//{
// // 【8】发送信息(收的数据为jfzpoi)
// sendData(clientSock, "sandeepin!\r\n");
// isReceiveData = false;
//}
//if (isReceiveData && data == "@end#")
//{
//}
}
}
}
int CTCPserver::OpenSocket()
{
bool a_Err = false;
// 【1】初始化WinSock
a_Err = initWinSock();
if (!a_Err)
{
return -1;
}
// 【2】创建socket
a_Err = createSocket(listenScok);
if (!a_Err)
{
return -1;
}
// 【3】socket绑定本机地址信息
bindIPandPort(listenScok, m_Ip, m_Port);
// 【4】侦听socket,接收客户端请求
listenSocket(listenScok);
ThreadFun = TcpReturnFun;
ThreadSarte(this);
return 0;
}
int CTCPserver::CloseSocket()
{
// 【9】关闭相关
int err = 0;
// err = shutdown(listenScok, 2);
// if (err == SOCKET_ERROR)
// {
// cout << "关闭失败!" << endl;
// }
// 关闭套接字,释放资源
err = closesocket(listenScok);
if (err == SOCKET_ERROR)
{
cout << "关闭socket失败!" << endl;
}
// 停止使用WinSock库,释放对应资源
if (WSACleanup() != 0)
{
cout << "WSA清空失败!" << endl;
}
cout << "关完了,坐等关机!poi" << endl;
return 0;
}
int CTCPserver::SendData(const char* data, int a_Len)
{
if (!isClientSockConnect)
{
return -1;
}
// 【8】发送信息(收的数据为jfzpoi)
sendData(clientSock, data, a_Len);
return 0;
}
// 【1】初始化WinSock
bool CTCPserver::initWinSock()
{
WORD verision = MAKEWORD(2, 2);
WSADATA lpData;
int intEr = WSAStartup(verision, &lpData); // 指定winsock版本并初始化
if (intEr != 0)
{
cout << "WinSock初始化失败!" << endl;
return false;
}
cout << "WinSock初始化成功!" << endl;
return true;
}
// 【2】创建socket
bool CTCPserver::createSocket(SOCKET &listenScok)
{
// 创建侦听socket
listenScok = socket(AF_INET, SOCK_STREAM, 0);
if (listenScok == INVALID_SOCKET)
{
cout << "socket创建失败!" << endl;
return false;
}
cout << "socket创建成功!" << endl;
return true;
}
// 【3】socket绑定本机地址信息
bool CTCPserver::bindIPandPort(SOCKET &listenScok, const char* ip, const unsigned short port)
{
// 制作sockaddr_in结构体
// 在bind函数,connect函数里提到了套接字编程网络地址信息结构体const struct sockaddr和const struct sockaddr_i
sockaddr_in hostAddr;
hostAddr.sin_family = AF_INET;
hostAddr.sin_port = htons(port);//转换成网络字节序
//hostAddr.sin_addr.S_un.S_addr = inet_addr(SERVERIP);//转换成网络字节序
//cout << "net IP:" << hostAddr.sin_addr.S_un.S_addr << endl;
/*
inet_addr()版本太低,被弃用使用inet_pton(协议族,字符串IP地址,void目标in_addr*)
头文件:WS2tcpip.h
*/
in_addr addr;
inet_pton(AF_INET, ip, (void*)&addr);
hostAddr.sin_addr = addr;
cout << "ip(网络字节序):" << addr.S_un.S_addr << endl;
cout << "ip(常规形式):" << ip << endl;
// 侦听套接字listenSock绑定本机地址信息
int err = bind(listenScok, (struct sockaddr*)&hostAddr, sizeof(sockaddr));
if (err != 0)
{
cout << "本地IP绑定失败!" << endl;
return false;
}
return true;
}
// 【4】侦听socket,接收客户端请求
bool CTCPserver::listenSocket(SOCKET &listenScok)
{
// 设定套接字为侦听状态,准备接收客户机进程发送来的连接请求
int err = listen(listenScok, 3);
if (err != 0)
{
cout << "socket监听失败!" << endl;
return false;
}
cout << "监听客户端连接中……" << endl;
return true;
}
// 【5】等待客户端连接-阻塞
bool CTCPserver::waitClientConnect(SOCKET &listenScok, SOCKET &clientSock)
{
sockaddr_in clientAddr;
int len = sizeof(struct sockaddr); // 必须指定长度,否则会导致accept返回10014错误
// accept会循环等待客户端连接
clientSock = accept(listenScok, (struct sockaddr*)&clientAddr, &len);
//cout << "客户端Socket编号:" << clientSock << endl;
if (clientSock == INVALID_SOCKET)
{
cout << "客户端连接失败!" << endl;
cout << WSAGetLastError() << endl;
return false;
}
return true;
}
// 【6】接收数据-阻塞
bool CTCPserver::receiveData(SOCKET &clientSock, char** data)
{
static int cnt = 1; // 接收数据编号-静态
// 通过已建立连接的套接字,接收数据 设定缓冲1024字节
char buf[1024] = "\0";
// flags操作方式(0正常数据,MSG_PEED系统缓冲区的数据复制到所提供的接收缓冲区内,系统缓冲区数据未删除,MSG_OOB处理带外数据,通常用参数0即可)
int buflen = recv(clientSock, buf, 1024, 0);
if (buflen == SOCKET_ERROR || buflen < 1)
{
cout << "接收失败!" << endl;
return false;
}
// 一切正常则显示接收数据
//data = string(buf);
memset(*data, 0, m_ObjNum);
strcpy(*data, buf);
cout << "收到第" << cnt++ << "次,内容为:\n" << buf << endl;
return true;
}
// 【7】停止套接字的接收、发送
bool CTCPserver::shutdownSocket(SOCKET &clientSock)
{
//(收完就关)停止套接字的接收、发送功能(0禁止接收,1禁止发送,2禁制接收发送)
int err = shutdown(clientSock, 2);
if (err == SOCKET_ERROR)
{
cout << "关闭Socket失败!" << endl;
return false;
}
return true;
}
// 【8】发送信息
bool CTCPserver::sendData(SOCKET &clientSock, const char* data, int a_Len)
{
int err = send(clientSock, data, a
没有合适的资源?快使用搜索试试~ 我知道了~
C++网口通讯源码分享
共40个文件
obj:8个
h:6个
tlog:6个
需积分: 0 4 下载量 61 浏览量
2023-05-23
11:16:58
上传
评论
收藏 13.43MB ZIP 举报
温馨提示
C++编写网口通讯源码,使用VS2015版本
资源推荐
资源详情
资源评论
收起资源包目录
Dey18 Socket通讯.zip (40个子文件)
Dey18 SocketͨѶ
Dey18 SocketͨѶ.sdf 39.06MB
.vs
Dey18 SocketͨѶ
v14
.suo 61KB
Dey18 SocketͨѶ
SocketFater.h 2KB
Dey18 SocketͨѶ.vcxproj 8KB
TCPserver.cpp 8KB
SocketFater.cpp 3KB
Dey18 SocketͨѶ.vcxproj.filters 2KB
Դ1.cpp 3KB
TCPserver.h 1KB
Դ2.cpp 1KB
TCPclient.h 1KB
Դ.cpp 4KB
TCPclient.cpp 7KB
Debug
TCPclient.obj 79KB
Դ2.obj 62KB
Դ.obj 45KB
Dey18 SocketͨѶ.log 2KB
TCPserver.obj 87KB
SocketFater.obj 314KB
UserTime.obj 154KB
OftenFunction.obj 740KB
vc140.idb 1.14MB
Դ1.obj 45KB
vc140.pdb 668KB
Dey18 SocketͨѶ.tlog
CL.write.1.tlog 13KB
CL.command.1.tlog 6KB
link.command.1.tlog 3KB
Dey18 SocketͨѶ.lastbuildstate 176B
link.read.1.tlog 4KB
link.write.1.tlog 1KB
CL.read.1.tlog 200KB
Dey18 SocketͨѶ.sln 1KB
Debug
Dey18 SocketͨѶ.pdb 2.2MB
Dey18 SocketͨѶ.ilk 691KB
Dey18 SocketͨѶ.exe 119KB
UserTime.h 1KB
UserClass.lib 40KB
UserClass.h 714B
OftenFunction.h 5KB
UserClass.dll 338KB
共 40 条
- 1
资源评论
机器视觉-孟
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功