www.pudn.com > LabWindowsCVI.rar > sample15.c
#include#include #include #include /* Needed if linking in external compiler; harmless otherwise */ #include #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; }