LabWindows/CVI是National Instruments公司推出的一套面向测控领域的软件开发平台。它以ANSI C为核心,将功能强大,使用灵活的C语言平台与数据采集,分析和表达的测控专业工具有机地接和起来。它的集成化开发平台,交互式编程方法,丰富的控件和库函数大大增强了C语言的功能,为熟悉C语言的开发人员建立检测系统,自动测量环境,数据采集系统,过程监控系统等提供了一个理想的软件开发环境。
LabWindows同时也支持Win32 SDK;能进行Win32应用程式开发.下例是以Socket API写的IP层抓包程序,功能非常简单,封包内容并没有详细分析,有兴趣的朋友可以试试做些协议分析;
在主Panel上添加两个Ring控件,3个Command Button,和一个Table,在Table创建5列;
- #include <cvirte.h>
- #include <userint.h>
- #include <winsock2.h>
- #include <ansi_c.h>
- #include <Mstcpip.h>
- #include "main.h"
- #include "iphead.h"
- static int panelHandle;
- SOCKET socket_id;
- HANDLE hThread;
- DWORD WINAPI CaptureThread(void*);
- int InitSocket(void){
- u_short wVersionRequested = 0x0202;
- WSADATA wsaData;
- if(SOCKET_ERROR == WSAStartup( wVersionRequested, &wsaData)){
- return 0;
- }
- return -1;
- }
- int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPSTR lpszCmdLine, int nCmdShow)
- {
- if (InitSocket() == 0){
- return -1;
- }
- if (InitCVIRTE (hInstance, 0, 0) == 0)
- return -1; /* out of memory */
- if ((panelHandle = LoadPanel (0, "main.uir", PANEL)) < 0)
- return -1;
- DisplayPanel (panelHandle);
- RunUserInterface ();
- DiscardPanel (panelHandle);
- return 0;
- }
- int CVICALLBACK BUTTON_EXIT (int panel, int control, int event,
- void *callbackData, int eventData1, int eventData2)
- {
- switch (event)
- {
- case EVENT_COMMIT:
- QuitUserInterface (0);
- break;
- }
- return 0;
- }
- int CVICALLBACK BUTTON_BEGIN_CAPTURE (int panel, int control, int event,
- void *callbackData, int eventData1, int eventData2)
- {
- switch (event)
- {
- case EVENT_COMMIT:{
- char FAR name[128];
- struct hostent FAR * pHostent;
- struct sockaddr_in addr;
- DWORD wt = 0;
- u_long sioarg = 1;
- u_long bioarg = 0;
- SetCtrlVal (panelHandle, PANEL_NUMERICMETER, 0);
- socket_id = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
- if(socket_id == INVALID_SOCKET){
- return 0;
- }
- if(gethostname(name, sizeof(name)) == -1){
- closesocket(socket_id);
- return 0;
- }
- pHostent = gethostbyname(name);
- addr.sin_family = AF_INET;
- addr.sin_addr = *(struct in_addr*)pHostent->h_addr;
- addr.sin_port = 0;
- //SetCtrlVal (panelHandle, PANEL_STRING,pHostent->h_name);
- if( SOCKET_ERROR == bind(socket_id,(struct sockaddr *)&addr,sizeof(addr) )){
- closesocket(socket_id);
- return 0;
- }
- if(SOCKET_ERROR == WSAIoctl(socket_id, SIO_RCVALL, &sioarg,sizeof(sioarg),NULL,0,&wt,NULL,NULL)){
- closesocket(socket_id);
- return 0;
- }
- if(SOCKET_ERROR == ioctlsocket(socket_id, FIONBIO , &bioarg)){
- closesocket(socket_id);
- return 0;
- }
- DeleteTableRows (panelHandle,PANEL_TABLE ,1,-1);
- if((hThread=CreateThread(NULL,0,CaptureThread,NULL,0,NULL)) == NULL){
- closesocket(socket_id);
- return 0;
- }
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON, ATTR_DIMMED, 1);
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_2, ATTR_DIMMED, 1);
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_3, ATTR_DIMMED, 0);
- break;
- }
- }
- return 0;
- }
- int CVICALLBACK BUTTON_STOP_CAPTURE (int panel, int control, int event,
- void *callbackData, int eventData1, int eventData2)
- {
- switch (event)
- {
- case EVENT_COMMIT:
- closesocket(socket_id);
- WaitForSingleObject(hThread,INFINITE);
- CloseHandle(hThread);
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON, ATTR_DIMMED, 0);
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_2, ATTR_DIMMED, 0);
- SetCtrlAttribute (panelHandle, PANEL_COMMANDBUTTON_3, ATTR_DIMMED, 1);
- break;
- }
- return 0;
- }
- DWORD WINAPI CaptureThread(void* param){
- char buf[65536];
- int len = 0;
- do{
- len = recv(socket_id, buf, sizeof(buf),0);
- if(len > 0){
- if(len > sizeof(IP_PK_HEAD)){
- IP_PK_HEAD iphead;
- struct in_addr src,dst;
- int insert_row_index;
- char strsrc[20];
- char strdst[20];
- char str_ver[8];
- char str_len[12];
- char str_ProtocolType[8];
- char str_PacketLen[12];
- char str_Sequence[12];
- memcpy( &iphead, buf, sizeof(iphead));
- iphead.wPacketLen = ntohs(iphead.wPacketLen);
- iphead.wSequence = ntohs(iphead.wSequence);
- iphead.wHeadCheckSum = ntohs(iphead.wHeadCheckSum);
- src.S_un.S_addr = iphead.dwIPSrc;
- dst.S_un.S_addr = iphead.dwIPDes;
- strcpy(strsrc, inet_ntoa(src));
- strcpy(strdst, inet_ntoa(dst));
- sprintf(str_ver,"%d",iphead.ver_hlen >> 4);
- sprintf(str_len,"%d",(iphead.ver_hlen & 0x0F) << 2);
- sprintf(str_PacketLen,"%d",iphead.wPacketLen);
- sprintf(str_Sequence,"%d",iphead.wSequence);
- GetNumTableRows(panelHandle,PANEL_TABLE,&insert_row_index);
- insert_row_index++;
- InsertTableRows (panelHandle, PANEL_TABLE, insert_row_index, 1, VAL_CELL_STRING);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(1,insert_row_index), str_ver);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(2,insert_row_index), str_len);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(3,insert_row_index), getProtocolName(str_ProtocolType,iphead.byProtocolType));
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(4,insert_row_index), str_PacketLen);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(5,insert_row_index), str_Sequence);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(6,insert_row_index), strsrc);
- SetTableCellVal (panelHandle, PANEL_TABLE, MakePoint(7,insert_row_index), strdst);
- }
- SetCtrlVal (panelHandle, PANEL_NUMERICMETER, len / 20);
- }
- }while(len > 0);
- return 0;
- }
- char * getProtocolName(char *namebuffer,BYTE byProtocolType){
- switch(byProtocolType){
- case PROTOCOL_TCP:
- strcpy(namebuffer,"TCP");
- return namebuffer;
- case PROTOCOL_UDP:
- strcpy(namebuffer,"UDP");
- return namebuffer;
- case PROTOCOL_ICMP:
- strcpy(namebuffer,"ICMP");
- return namebuffer;
- case PROTOCOL_IGMP:
- strcpy(namebuffer,"IGMP");
- return namebuffer;
- default:
- strcpy(namebuffer,"UNKNOW");
- return namebuffer;
- }
- }
- int CVICALLBACK PANEL_FORM (int panel, int event, void *callbackData,
- int eventData1, int eventData2)
- {
- switch (event)
- {
- case EVENT_GOT_FOCUS:
- break;
- case EVENT_LOST_FOCUS:
- break;
- case EVENT_CLOSE:
- closesocket(socket_id);
- WSACleanup();
- WaitForSingleObject(hThread,INFINITE);
- CloseHandle(hThread);
- break;
- }
- return 0;
- }