📄 sample15.c
字号:
#include <tcpsupp.h>
#include <utility.h>
#include <ansi_c.h>
#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include "sample15.h"
#define SERVER 0
#define CLIENT 1
static int panelHandle;
static int progType;
static int convHandle;
int CVICALLBACK ClientCallback(unsigned handle, int event,
int error, void *callbackData);
int CVICALLBACK ServerCallback(unsigned handle, int event,
int error, void *callbackData);
int main (int argc, char *argv[])
{
//定义变量
char serverName[256];
char portNumString[32];
int portNumber,button;
if (InitCVIRTE (0, argv, 0) == 0)
return -1;
//在调试模式下,如果库函数报错,LabWindows/CVI不显示运行出错对话框
// DisableBreakOnLibraryErrors函数包含在Utility函数库中
//与之对应的函数为EnableBreakOnLibraryErrors函数
DisableBreakOnLibraryErrors();
//调用通用消息框,选择该程序是作为服务器程序还是客户程序
button = GenericMessagePopup ("Program Type",
"Please Select Program Type:",
"TCP __Server", "TCP C__lient",
"__Cancel", 0, -1, 0,
VAL_GENERIC_POPUP_BTN3,
VAL_GENERIC_POPUP_BTN1,
VAL_GENERIC_POPUP_BTN3);
if((button!=1)&&(button!=2))
return -1;
progType = button-1;
//如果为客户程序提示输入服务器名
if(progType==CLIENT)
PromptPopup ("Server Name?",
"Please Input TCP Server Name:",
serverName, 255);
//提示输入服务器端口号
PromptPopup ("Port Number?",
"Please Input TCP Port Number:",
portNumString, 31);
portNumber = atoi(portNumString);
if ((panelHandle = LoadPanel (0, "sample15.uir", PANEL)) < 0)
return -1;
//如果为服务器程序,调用RegisterTCPServer函数注册服务器
//服务器回调函数为ServerCallback
if(progType==SERVER)
if ( RegisterTCPServer(portNumber, ServerCallback, NULL)<0)
{
//注册失败,报错并退出
MessagePopup ("TCP Server", "RegisterTCPServer failed !!!");
return -1;
}
//根据程序类型设置TEXTMSG控件值
if(progType==SERVER)
SetCtrlVal (panelHandle, PANEL_TEXTMSG, "Server");
if(progType==CLIENT)
SetCtrlVal (panelHandle, PANEL_TEXTMSG, "Client");
//如果为客户程序,连接到服务器
//客户回调函数为ClientCallback
if(progType==CLIENT)
if (ConnectToTCPServer (&convHandle, portNumber, serverName,
ClientCallback, NULL, 5000)<0)
{
//连接失败,报错并退出
MessagePopup("TCP Client", "Connection to server failed !");
return -1;
}
else
{
//连接成功,设置STATUS控件值为1
SetCtrlVal (panelHandle, PANEL_STATUS, 1);
}
SetPanelPos (panelHandle, VAL_AUTO_CENTER, VAL_AUTO_CENTER);
DisplayPanel (panelHandle);
RunUserInterface ();
//退出程序之前,如果是服务器程序,注销服务器;
//如果是客户程序,断开连接
if(progType==SERVER)
UnregisterTCPServer(portNumber);
if(progType==CLIENT)
DisconnectFromTCPServer(convHandle);
return 0;
}
int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK InfoCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char info[200];
char temp[30];
int status;
switch (event)
{
case EVENT_COMMIT:
//获取STATUS控件的值
GetCtrlVal (panel, PANEL_STATUS, &status);
//如果为连接,显示信息并退出
if(!status)
{
MessagePopup ("Infomation", "No connected.");
break;
}
//如果为服务器程序,显示主机地址和主机名
if(progType==SERVER)
{
GetTCPHostAddr (temp, sizeof(temp));
strcpy (info, "The Host Address is ");
strcat (info, temp);
strcat (info, ",and the Host Name is ");
GetTCPHostName (temp, sizeof(temp));
strcat (info, temp);
MessagePopup ("Infomation", info);
}
//如果为客户程序,显示连接的主机地址和主机名
if(progType==CLIENT)
{
GetTCPPeerAddr (convHandle,temp, sizeof(temp));
strcpy (info, "The Peer Address is ");
strcat (info, temp);
strcat (info, ",and the Peer Name is ");
GetTCPPeerName (convHandle,temp, sizeof(temp));
strcat (info, temp);
MessagePopup ("Infomation", info);
}
break;
}
return 0;
}
int CVICALLBACK ClearCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
ResetTextBox (panel, PANEL_RECEIVEDATA, "");
break;
}
return 0;
}
int CVICALLBACK SendCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char buffer[1000];
switch (event)
{
case EVENT_COMMIT:
//获取控件DATATOSEND中的值
GetCtrlVal (panel, PANEL_DATATOSEND, buffer);
//判断程序的类型,调用不同的函数发送数据
if(progType==SERVER)
ServerTCPWrite (convHandle, buffer, strlen(buffer), 0);
if(progType==CLIENT)
ClientTCPWrite (convHandle, buffer, strlen(buffer), 0);
break;
}
return 0;
}
//服务器回调函数
int CVICALLBACK ServerCallback(unsigned handle, int event, int error,
void *callbackData)
{
char buffer[512];
int status;
switch (event) {
//客户程序请求连接
case TCP_CONNECT:
//设置STATUS控件值为1
SetCtrlVal(panelHandle, PANEL_STATUS, 1);
//弹出对话框显示连接成功
MessagePopup("TCP Server", "New connection established!");
break;
//接收到从客户应用程序发送来的数据
case TCP_DATAREADY:
//读取数据
if((status = ServerTCPRead(handle, buffer, 512, 1000))<0)
{
//读取数据失败,报错
MessagePopup("TCP Server", "TCP read error!");
return -1;
}
//将读取的数据显示到控件RECEIVEDATA中
SetCtrlVal (panelHandle, PANEL_RECEIVEDATA, buffer);
break;
//断开连接
case TCP_DISCONNECT:
//提示断开连接
MessagePopup("TCP Server", "Connection closed by client!");
//设置STATUS控件值为0
SetCtrlVal(panelHandle, PANEL_STATUS, 0);
break;
}
return 0;
}
//客户回调函数
int CVICALLBACK ClientCallback(unsigned handle, int event, int error,
void *callbackData)
{
char buffer[256];
int status;
switch (event) {
//接收到服务器发送的数据
case TCP_DATAREADY:
//读取数据
if((status = ClientTCPRead(handle, buffer, 256, 1000))<0)
{
//读取数据错失败,报错并返回
MessagePopup("TCP Client", "TCP read error!");
return -1;
}
//将读取的数据显示到RECEIVEDATA控件中
SetCtrlVal (panelHandle, PANEL_RECEIVEDATA, buffer);
break;
//断开连接
case TCP_DISCONNECT:
//显示断开连接消息
MessagePopup("TCP Client", "Server has closed connection!");
//设置控件STATUS的值为0
SetCtrlVal(panelHandle, PANEL_STATUS, 0);
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -