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; 
}