⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample15.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 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 + -