首页 > 其他分享 >TCP Server

TCP Server

时间:2022-09-29 11:34:18浏览次数:44  
标签:index handle addresses int TCP Server hconversation

TCP服务器(单客户端)

1. 获取本地主机的IP和端口号

若本地主机有多个IP地址,则需要获取本地主机所有IP地址,指定某个IP地址用于创建服务器。

	char **addresses = NULL;
	char addr_arr[10][20] = {0};
	int numAddresses;
	GetAllTCPHostAddresses (&addresses, &numAddresses);
	/* Use the address strings... */
	for (int index = 0; index < numAddresses; index++)
	{
		strcpy (addr_arr [index], addresses [index]);  //copy all address to array
		TCPFreeMemory (addresses[index]);  //Free address string
	}
	TCPFreeMemory (addresses);  //Free addresses array

2. 注册TCP服务器

有了IP端口号,就可以注册TCP服务器。

if (RegisterTCPServerEx (portNum, ServerTCPCB, 0, ip_address) < 0)
	{
		MessagePopup("TCP Server", "Server registration failed!");
	}

ServerTCPCB指向处理客户端请求的同步回调函数的指针。

3. TCP服务器和客户端的通讯

/* tcp服务器回调函数原型 */
int (*tcpFuncPtr) (unsigned handle, int xType, int errCode, void *callbackData);
//unsigned handle :句柄 ???
//int xType :接收事件类型(TCP_CONNECT、TCP_DISCONNECT、TCP_DATAREADY)
//int errCode:用于判断TCP_DISCONNECT的原因

tcp服务器回调函数的调用

int CVICALLBACK ServerTCPCB (unsigned handle, int event, int error,void *callbackData)
{
	char receiveBuf[256] = {0};  
	int dataSize = sizeof (receiveBuf) - 1;  //Receive max size is 255 Byte
	char addrBuf[31];
	switch (event)
		{
		case TCP_CONNECT:
			if (g_hconversation)
				{
				/* We already have one client, don't accept another... */
                ;
				tcpChk (DisconnectTCPClient (handle));
				}
			else
				{
				/* Handle this new client connection */
				g_hconversation = handle;
                ;
				/* Set the disconect mode so we do not need to terminate connections ourselves. */
				tcpChk (SetTCPDisconnectMode (g_hconversation, TCP_DISCONNECT_AUTO));
				}
			break;
		case TCP_DATAREADY:
			if ((dataSize = ServerTCPRead (g_hconversation, receiveBuf, dataSize, 1000)) < 0)
				{
				;
				}
			else
				{
				receiveBuf[dataSize] = '\0';
				;
				}
			break;
		case TCP_DISCONNECT:
			if (handle == g_hconversation)
				{
				/* The client we were talking to has disconnected... */
				g_hconversation = 0;
                ;
				/* Note that we do not need to do any more because we set the disconnect mode to AUTO. */
				}
			break;
	}
Done:    
	return 0;
}

标签:index,handle,addresses,int,TCP,Server,hconversation
From: https://www.cnblogs.com/caojun97/p/16740874.html

相关文章

  • 【SQLServer】SQLServer执行计划运算符-第2部分
    1.【SQLServer】SQLServer执行计划概览2.【SQLServer】SQLServer执行计划的类型3.【SQLServer】如何分析图形化的SQL执行计划4.【SQLServer】SQLServer执行计划运算符-......
  • IMC服务安装过程提示:尝试创建数据库失败请确认是否存在文件夹'C:\Program Files\imc
    问题如图:登录到iMC服务器桌面,在服务器管理器中点击配置-服务,找到MSSQLSERVER,右键属性,在登录选项卡中选择登录身份为“本地系统账号”,如下图所示: 重新启动服务器,重......
  • Can’t connect to local MySQL server through socket 原因解析
    在连接mysql的时,经常会出现以下错误提示:ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/var/lib/mysql/mysql.sock' 出现此错误提示的原因一......
  • TCP和UDP有啥区别?
    TCP全称:TransmissionControlProtocol中文名:传输控制协议解释:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。用途:TCP旨在适应支持多......
  • Linux 网络编程——TCP 和 UDP 数据报格式详解
    TCP报文格式TCP(TransmissionControlProtocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP报文段的报头有10个必需的字段和1个可选字段......
  • C#通过KEPServer对PLC进行读写(二):读取
    在通过OPCAutomation我们先了解下这个类下的三个对象1.OPCServer:创建OPC的连接2.OPCBrowser:创建OPC浏览对象3.OPCGroups:OPC通信组对象4.OPCItem:单个代操作(读取的对象)......
  • C#通过KEPServer对PLC进行读写(一):安装OPCDAAuto.dll
    之前我们已经尝试了KEPServer连接PLC读取数据,并且还成功将读取到的数据写入到MYSQL,这次分享下上层系统通过OPCAutomation来对KEPServer中的数据进行读写。在这之前,我们需......
  • geoserver 安装
    下载满足要求的geoserverdockerpullkartoza/geoserver:2.21.1自定义用户密码启动docker,数据路径按需求挂载出来/opt/geoserver/data_dirdockerrun--namege......
  • 什么是 Serverless 架构?
    简介: 什么是Serverless架构?Serverless与AI机器学习之间怎样碰撞出火花? 随着时间的推移,Serverless架构变得越来越火热,凭借着极致弹性、按量付费、低成......
  • 实战指南 | Serverless 架构下的应用开发
    简介: 基于Serverless架构的应用开发流程将会比基于传统架构的应用开发更简单。在Serverless架构下进行应用开发,用户通常只需要按照规范编写代码、构建产物,然后部署到......