资源描述
LabWindows CVI TCP程序说明
1 本系统框图如下:
终端Client
服务器sever
路由交换机
2 TCP函数说明
2.1 Client Functions客户端
ClientTCPRead (unsigned int conversationHandle, void *dataBuffer, size_t dataSize, unsigned int timeOut);
参量1:操作柄、参量2:读入数据、参量3:读入数据长度、参量4:溢出时间。
Return:读出数据的字节长度(可用来校验数据)。
ClientTCPWrite (unsigned int conversationHandle, void *dataPointer, size_t dataSize, unsigned int timeOut);
参量1:操作柄、参量2:输出数据、参量3:读入数据长度、参量4:溢出时间。
Return:写入数据的字节长度(可用来校验数据)。
ConnectToTCPServer (unsigned int **conversationHandle, unsigned int portNumber, char serverHostName[], tcpFuncPtr callbackFunction, void *callbackData, unsigned int timeOut);
参量1:操作柄、参量2:当前端口、参量3:服务器地址、参量4:回调函数、参量5:溢出时间
Return:写入数据的字节长度(可用来校验数据)。
DisconnectFromTCPServer (unsigned int conversationHandle);
参量:操作柄
2.2 Sever Functions服务器端
DisconnectTCPClient (unsigned int conversationHandle);
参量:操作柄
RegisterTCPServer (unsigned int portNumber, tcpFuncPtr callbackFunction, void *callbackData);
参量1:当前端口、参量2:回调函数、参量3:返回数据(NULL)
ServerTCPRead (unsigned int conversationHandle, void *dataBuffer, size_t dataSize, unsigned int timeOut);
参量1:操作柄、参量2:读入数据、参量3:读入数据长度、参量4:溢出时间。
Return:读出数据的字节长度(可用来校验数据)。
ServerTCPWrite (unsigned int conversationHandle, void *dataPointer, size_t dataSize, unsigned int timeOut);
参量1:操作柄、参量2:输出数据、参量3:读入数据长度、参量4:溢出时间。
Return:写入数据的字节长度(可用来校验数据)。
UnregisterTCPServer (unsigned int portNumber);
UnregisterTCPServerEx (unsigned int portNumber, const char localhostAddress[]);
2.3 Support Functions 支持函数
GetAllTCPHostAddresses (char ****addresses, int **numberOfAddresses);
参量1:network interface address、参量2:number of address
GetHostTCPSocketHandle (unsigned int connectionHandle, intptr_t **socketHandle);
获取当前操作柄
GetTCPHostAddr (char buffer[], size_t bufferSize);
获取本机的IP Address
GetTCPHostConnectionAddr (unsigned int connectionHandle, char buffer[], size_t bufferSize);
参量1:操作柄、参量2:输出地址、参量3:数据长度。
GetTCPHostName (char buffer[], size_t bufferSize);
获取主机(本机)用户名。
GetTCPPeerAddr (unsigned int connectionHandle, char buffer[], size_t bufferSize);
参量1:操作柄、参量2:输出地址、参量3:数据长度。
获取对方的IP地址
GetTCPPeerName (unsigned int connectionHandle, char buffer[], size_t bufferSize);
参量1:操作柄、参量2:输出地址、参量3:数据长度。
获取对方的用户名
SetTCPDisconnectMode (unsigned int conversationHandle, int disconnectMode);
参量1:操作柄、参量2:模式选择。
2.4 Other 其它函数
*GetTCPErrorString (int errorNumber);
根据当前错误代码,调出当前错误类型。
char *GetTCPSystemErrorString (void);
获取当前错误代码。
int ProcessTCPEvents (void);
获取当前TCP处理事件。
TCPFreeMemory (void *pointerToMemory);
释放内存。
3 例程说明
3.1 服务器sever
/****************************************************************************
>>>function :TcpConnect连接 TcpDisconnect断开
>>>intput :N/A
>>>output :Tcpip.tcp_Port(600) TCP端口
>>>
*****************************************************************************/
int CVICALLBACK TcpConnect (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int status=0;
char tcp_Port[10];
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_STRING_SERVER_PORT, tcp_Port);// 获得TCP服务器端口号
sscanf(tcp_Port, "%u", &Tcpip.tcp_Port);
status = RegisterTCPServer (Tcpip.tcp_Port, TcpServerCall, 0);
if(!status){ //注册成功 得到主机信息
Tcpip.tcp_Using=1;
SetCtrlAttribute (panelHandle, PANEL_BUTTON_CONNECT, ATTR_DIMMED, 1);
SetCtrlAttribute (panelHandle, PANEL_BUTTON_DISCONNECT, ATTR_DIMMED, 0);
GetHostInfo();//获取主机信息
}
break;
}
return 0;
}
/****************************************************************************
>>>function :TcpServerCall TCP接收数据处理部分(主机)
>>>intput :Tcpip.client_Handle操作柄
>>>output :
>>>
*****************************************************************************/
int CVICALLBACK TcpServerCall(unsigned handle, int event, int error,
void *callbackData)
{
int i;
char client_Ip[50];
char rev_Data[200];
char Rev_Length[50];
switch (event)
{
case TCP_CONNECT:
Tcpip.client_Handle = handle; // 获得客户端句柄,赋给全局变量
GetTCPPeerAddr (Tcpip.client_Handle, client_Ip, 50); // 获得客户端 IP 地址
SetCtrlVal (panelHandle, PANEL_STRING_CLIENT_IP, client_Ip);
// Client led亮为绿色
SetCtrlAttribute (panelHandle, PANEL_LED_CLIENT, ATTR_ON_COLOR, VAL_GREEN);
SetCtrlVal (panelHandle, PANEL_LED_CLIENT, 1); // Client led亮
// 设置 TCP 断开方式为自动
SetTCPDisconnectMode (Tcpip.client_Handle, TCP_DISCONNECT_AUTO);
break;
case TCP_DATAREADY:
memset (rev_Data, '\0', 200); // 数组清0
Tcpip.tcp_Rev_Length = ServerTCPRead (Tcpip.client_Handle, rev_Data, 200, 1000);// 从TCP服务器读数据
//de_protocol(data, read_len, ret_data, &ret_len); // 协议解析
for(i=0;i<strlen(rev_Data);i++){ //取出数据
Tcpip.tcp_Rev_Data[i]=rev_Data[i];
}
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, "\n接收到数据:");
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, rev_Data);
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, "\n");
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, "***************************************************");
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, "\n");
sprintf(Rev_Length, "Read from TCP Client: %d Bytes", Tcpip.tcp_Rev_Length);
SetCtrlVal (panelHandle, PANEL_TEXTBOX_TCP_ASCII, Rev_Length); // 显示接收数据长度
break;
case TCP_DISCONNECT:
if(handle==Tcpip.client_Handle){ // 因为断开方式被设置为自动,所以这里不需要调用DisconnectTCPClient
Tcpip.client_Handle = 0; // Disconnect时不需要再断了
SetCtrlVal (panelHandle, PANEL_LED_CLIENT, 0); // Client led灭
SetCtrlVal (panelHandle, PANEL_STRING_CLIENT_IP, ""); // 清空 IP 栏
}
break;
}
return 0;
}
注:发送数据、获取信息都是一些很简单的调用,不再介绍。
3.2 客户端Client
int CVICALLBACK connect (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char sever_Addr[20];
char sever_Name[20];
char sever_Port[10];
char message_Buffer[255];
int status=0;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_STRING_ADDRESS, sever_Addr);
GetCtrlVal (panelHandle, PANEL_STRING_PORTNUMBER, sever_Port);
sscanf(sever_Port, "%u", &Tcpip.tcp_Port);
DisableBreakOnLibraryErrors ();
status=ConnectToTCPServer (&Tcpip.client_Handle, Tcpip.tcp_Port, sever_Addr, tcpCallback, 0, 0);
EnableBreakOnLibraryErrors ();
if(!status){
Tcpip.tcp_Using=1;//链接标识位
GetTCPPeerName (Tcpip.client_Handle, sever_Name, 20);
SetCtrlVal (panelHandle, PANEL_STRING_SERVERIP, sever_Addr);
SetCtrlVal (panelHandle, PANEL_STRING_SERVERNAME, sever_Name);
SetCtrlAttribute (panelHandle, PANEL_LED_SERVER, ATTR_ON_COLOR, VAL_RED);
SetCtrlVal (panelHandle, PANEL_LED_SERVER, 1);
SetCtrlAttribute (panelHandle, PANEL_CMD_CONNECT, ATTR_DIMMED, 1);
SetCtrlAttribute (panelHandle, PANEL_CMD_DISCONNECT, ATTR_DIMMED, 0);
}
else{//超时溢出
sprintf(message_Buffer, "TCP library error message: %s\nSystem error message: %s",
GetTCPErrorString (status), GetTCPSystemErrorString());
MessagePopup ("Error", message_Buffer);
}
break;
}
return 0;
}
/**************************************************************************
>>>function :tcpCallback tcp连接回调函数
>>>input :handle操作柄
>>>ouput :DATA传送到textbox上
***************************************************************************/
int tcpCallback(unsigned handle, int xType, int errCode,
void *callbackData)
{
char data[256];
char Rev_Length[50];
int tcp_Rev_Length;
switch(xType){
case TCP_DISCONNECT:
SetCtrlVal (panelHandle, PANEL_LED_SERVER, 0);
SetCtrlVal (panelHandle, PANEL_STRING_SERVERIP, "");
SetCtrlVal (panelHandle, PANEL_STRING_SERVERNAME, "");
break;
case TCP_DATAREADY:
ClientTCPRead (handle, data, 200, 1);
data[strlen(data)+1]='\0';
SetCtrlVal (panelHandle, PANEL_TEXTBOX, data);
SetCtrlVal (panelHandle, PANEL_TEXTBOX, "\n");
sprintf(Rev_Length, "Read from TCP Server: %d Bytes", strlen(data));
SetCtrlVal (panelHandle, PANEL_TEXTBOX, Rev_Length); // 显示接收数据长度
SetCtrlVal (panelHandle, PANEL_TEXTBOX, "\n");
break;
}
return 0;
}
展开阅读全文