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

📄 testimagegrab.cpp

📁 用socket的Event select方式进行 五个连接数据的接收
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		        #if 1   
				//u32ImageLenAfterConvert = ntohl(u32IMAGELen);

				/*write the recved Jpg data to file*/

				sprintf( (char*)(u32)s8JpgNameBuf, "d:\\data\\%d\\%d.jpg", u32j + 1, g_u32ReadIndex[u32j]);
				pJpgFile = fopen((char*)(u32)s8JpgNameBuf, "wb+");

				/*如果文件成功打开*/
				if (pJpgFile != NULL)
				{
					/*写文件头*/
					/*写0xffd8*/
					u16Temp = 0xd8ff;
					fwrite((void*)(u32)&u16Temp, sizeof(u16), 1, pJpgFile);

					/*写0xffc0开始的数组*/
					for (u32i = 0; u32i < IMAGE_JPG_HEAD_FFC0_LEN; u32i++)
					{
						fwrite((void*)(u32)&g_u8JpgHead_FFC0[u32i], sizeof(u8), 1, pJpgFile);
					}

					/*写0xffdb开始的数组*/
					for (u32i = 0; u32i < IMAGE_JPG_HEAD_FFDB_LEN; u32i++)
					{
						fwrite((void*)(u32)&g_u8JpgHead_FFDB[u32i], sizeof(u8), 1, pJpgFile);
					}

					/*写0xffc4开始的数组*/
					for (u32i = 0; u32i < IMAGE_JPG_HEAD_FFC4_LEN; u32i++)
					{
						fwrite((void*)(u32)&g_u8JpgHead_FFC4[u32i], sizeof(u8), 1, pJpgFile);
					}

					/*写0xffda开始的数组*/
					for (u32i = 0; u32i < IMAGE_JPG_HEAD_FFDA_LEN; u32i++)
					{
						fwrite((void*)(u32)&g_u8JpgHead_FFDA[u32i], sizeof(u8), 1, pJpgFile);
					}


					fwrite( (void*)g_u32BufferPointer[u32j][g_u32ReadIndex[u32j]], sizeof(s8), g_u32BufferLen[u32j][g_u32ReadIndex[u32j]], pJpgFile);



					/*写文件尾*/
					/*写0xffd9*/
					u16Temp = 0xd9ff;
					fwrite((void*)(u32)&u16Temp, sizeof(u16), 1, pJpgFile);

					
				}
				else
				{
					/*处理下一路*/
					continue;
				}
				
				/*关闭文件以及善后处理*/
				fclose(pJpgFile);
				pJpgFile = NULL;
				
				//send( g_socketNewTcpSocket, (char*)(u32)&u32IMAGELen,  sizeof(u32), 0);
		        #endif
                
				/*释放buffer*/
                free((void*)g_u32BufferPointer[u32j][g_u32ReadIndex[u32j]]);
				g_u32BufferPointer[u32j][g_u32ReadIndex[u32j]] = NULL;
                
				/*把buffer长度置0*/
				g_u32BufferLen[u32j][g_u32ReadIndex[u32j]]  = 0;

				/*指针加加*/
				g_u32ReadIndex[u32j]++;
				g_u32ReadIndex[u32j] %= IMAGE_CAMERA_ONE_PATH_BUFS; 
			
			}
			else
			{
				/*处理下一路*/
				continue;
			}/*End of */		
		}/*End of for (u32j = 0; u32j < IMAGE_CAMERA_NUM; u32j++)*/	

		if (u32HasDataNums == 0)
		{
			Sleep(10);		
		}

	}/* End of while (1)*/

	_endthread();
}


void FreeBuf(void)
{

	u32						u32i;
	u32						u32j;

	for (u32i= 0; u32i < IMAGE_CAMERA_NUM; u32i++)
	{
		g_u32WriteIndex[u32i] = 0;
		g_u32ReadIndex[u32i] = 0;	
	}

	for (u32i= 0; u32i < IMAGE_CAMERA_NUM; u32i++)
	{
		for (u32j = 0; u32j < IMAGE_CAMERA_ONE_PATH_BUFS; u32j++)
		{
			if (g_u32BufferPointer[u32i][u32j] != 0)
			{
				free((void*)(g_u32BufferPointer[u32i][u32j]));			
			}
					
		}
	}



}

void InitBuf(void)
{
	u32						u32i;
	u32						u32j;

	for (u32i= 0; u32i < IMAGE_CAMERA_NUM; u32i++)
	{
		g_u32WriteIndex[u32i] = 0;
		g_u32ReadIndex[u32i] = 0;	
	}

	for (u32i= 0; u32i < IMAGE_CAMERA_NUM; u32i++)
	{
		for (u32j = 0; u32j < IMAGE_CAMERA_ONE_PATH_BUFS; u32j++)
		{
			g_u32BufferPointer[u32i][u32j] = 0;		
		}
	}
}


int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	char strIPAddress[20];
	int i;
	wVersionRequested = MAKEWORD( 2, 2 );
    u32						u32i;
	unsigned long           HandleListenThread;
	unsigned long           HandleMonitorImagesSocketUDP;
	unsigned long           HandleWrite2Disk1;
	unsigned long           HandleWrite2Disk2;

	/*设置本线程的优先级*/
	SetThreadPriority(GetCurrentThread(), IMAGE_CURRENT_THREAD_PRIORITY);

 
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		printf("Could not find a usable WinSock DLL\n");
		return 0;
	}
 
	/* Confirm that the WinSock DLL supports 2.2.*/
	/* Note that if the DLL supports versions greater    */
	/* than 2.2 in addition to 2.2, it will still return */
	/* 2.2 in wVersion since that is the version we      */
	/* requested.                                        */
 
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
			HIBYTE( wsaData.wVersion ) != 2 ) {
		WSACleanup( );
		printf("Could not find a usable WinSock DLL\n");
		return 0; 
	}

    /*进行buffer的初始化*/

	InitBuf(); 
	HandleListenThread = _beginthread(ListenImagesSocket,1024000,0);
	HandleMonitorImagesSocketUDP = _beginthread(MonitorImagesSocketUDP,1024000,0);
	SetThreadPriority((void*)HandleListenThread, IMAGE_CURRENT_THREAD_PRIORITY);
	SetThreadPriority((void*)HandleMonitorImagesSocketUDP, IMAGE_CURRENT_THREAD_PRIORITY);


	/*开始轮训 buffer的线程的同步信号量*/
	for (u32i = 0; u32i < IMAGE_CAMERA_NUM; u32i++)
	{
		g_handleSemphore2WriteThread[u32i] = CreateSemaphore(NULL, 0, IMAGE_CAMERA_ONE_PATH_BUFS, NULL);
		if (NULL == g_handleSemphore2WriteThread)
		{
			(void)printf("Create Write semphore fail!\n");
			return -1;
		}	
	}


	HandleWrite2Disk1 = _beginthread(WritePic2Disk1,1024000,0);
	SetThreadPriority((void*)HandleWrite2Disk1, IMAGE_CURRENT_THREAD_PRIORITY);

	HandleWrite2Disk2 = _beginthread(WritePic2Disk2,1024000,0);
	SetThreadPriority((void*)HandleWrite2Disk2, IMAGE_CURRENT_THREAD_PRIORITY);

	DWORD dwCommand;
	ZXG_COMMAND cmdPacket;
	SOCKET SendSocket;
	sockaddr_in RecvAddr;
	int Port = 0;

	SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (INVALID_SOCKET == SendSocket)
	{
		printf("Could not create socket,%x\n",WSAGetLastError());
	}

	while (1)
	{
		scanf("%d",&dwCommand);
		printf("%d\n",dwCommand);
		if (dwCommand==0) break;
		if (dwCommand==10)
		{
			_beginthread(GrabImagesContinuous,1024000,0);
			continue;
		}
		cmdPacket.u32CmdType = dwCommand;
		cmdPacket.u32ExposeTime = 500;
		cmdPacket.u32Gain = 400;

		if (dwCommand == 1)
		{
			InitBuf();
		}

		

		if (dwCommand == 5)
		{
			FreeBuf();
		}

		//---------------------------------------------
		// Set up the RecvAddr structure with the IP address of
		// the receiver (in this example case "123.456.789.1")
		// and the specified port number.
		for (i=0;i<4;i++){
			sprintf(strIPAddress,"169.254.0.%d",i+11);
			Port = 4099;
			RecvAddr.sin_family = AF_INET;
			RecvAddr.sin_port = htons(Port);
			RecvAddr.sin_addr.s_addr = inet_addr(strIPAddress);

			//---------------------------------------------
			// Send a datagram to the receiver
			printf("Sending a datagram to the receiver...\n");
			sendto(SendSocket, 
				(char *)&cmdPacket, 
				sizeof(cmdPacket), 
				0, 
				(SOCKADDR *) &RecvAddr, 
				sizeof(RecvAddr));
		}

	}
	
	closesocket(SendSocket);

	WSACleanup();

	return 0;
}

typedef struct {
	SOCKET s;
	int nIndex;
} Param;


/*全局事件,下标以board 的编号(IP地址来索引)*/
WSAEVENT           g_EventArray[IMAGE_CAMERA_NUM] = {NULL, NULL, NULL, NULL, NULL};
SOCKET             g_sockRecvSock[IMAGE_CAMERA_NUM];
u32				   g_BoardIndexValid[IMAGE_CAMERA_NUM] = {0,0,0,0,0};

/*已经接收连接的数量*/
int                g_nSocknumAccepted = 0;

/*在接收线程里用来等待的Event数组*/
WSAEVENT           g_EventArrayForWait[IMAGE_CAMERA_NUM];


/*在接收线程里用来进行事件索引的网络事件数组*/
WSANETWORKEVENTS g_NetworkEvents[IMAGE_CAMERA_NUM];




/******************************************************************************************************************\
该函数用来监测图像计算机发来的图像信息
\******************************************************************************************************************/
void ListenImagesSocket(void *arg)
{
	sockaddr_in				sockAddrAccepting;
	int                     intSockAddrSize = sizeof(struct sockaddr);
	int                     intBoardIdx;
	unsigned long           handleChildThread;



	WSAEVENT EventArray[1];
	WSANETWORKEVENTS NetworkEvents;

	int nIndex=0;
	
	SOCKET RecvSocket = WSASocket(AF_INET, 
		SOCK_STREAM, 
		IPPROTO_TCP, 
		NULL, 
		0, 
		WSA_FLAG_OVERLAPPED);
#if 0
    SOCKET RecvSocket = socket( AF_INET, SOCK_STREAM, 0 );
	if (INVALID_SOCKET == RecvSocket)
	{
		printf("Could not create socket,%x\n",WSAGetLastError());
		_endthread();
	}
#endif
	sockaddr_in service;
	service.sin_family = AF_INET;
	service.sin_addr.s_addr = ADDR_ANY;
	service.sin_port = htons(5100);


	//----------------------
	// Bind the socket.
	if (bind( RecvSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) {
		printf("bind() failed.\n");
		closesocket(RecvSocket);
		_endthread();
	}

	//-------------------------
	// Create new event
	EventArray[0] = WSACreateEvent();

	//-------------------------
	// Associate event types FD_ACCEPT and FD_CLOSE
	// with the listening socket and NewEvent
	WSAEventSelect( RecvSocket, EventArray[0], FD_ACCEPT);

	if (listen( RecvSocket,15 ) == SOCKET_ERROR)
		printf("Error listening on socket.\n");

  
	SOCKET AcceptSocket;
	printf("Waiting for client to connect...\n");


	//----------------------
	// Accept the connection.
	while(1) {

#if 0
			AcceptSocket = accept( RecvSocket, (struct sockaddr *)((unsigned int)(&sockAddrAccepting)), &intSockAddrSize);
			printf("Client connected.\n");
			Param *param=new Param;

			intBoardIdx = sockAddrAccepting.sin_addr.S_un.S_un_b.s_b4;
			//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[1]);
			//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[2]);
			//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[3]);

			param->nIndex = intBoardIdx - 10; /*得到板卡编号*/
			param->s = AcceptSocket;
			handleChildThread = _beginthread(RecvImagesSocket,10240,(void *)param);
			SetThreadPriority((void*)handleChildThread, IMAGE_CURRENT_THREAD_PRIORITY);
#endif

#if 1
		if (WSAWaitForMultipleEvents(1,EventArray,TRUE,1000000,FALSE)==WAIT_TIMEOUT)
		{
			printf("timeout\n");
			//break;
		}
		else
		{
			WSAEnumNetworkEvents(RecvSocket, EventArray[0], &NetworkEvents);
			WSAResetEvent(EventArray[0]);
			if (NetworkEvents.lNetworkEvents&FD_ACCEPT)
			{
				AcceptSocket = accept( RecvSocket, (struct sockaddr *)((unsigned int)(&sockAddrAccepting)), &intSockAddrSize);
				printf("Client connected.\n");
				Param *param=new Param;

				intBoardIdx = sockAddrAccepting.sin_addr.S_un.S_un_b.s_b4;
				//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[1]);
				//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[2]);
				//intBoardIdx = sockAddrAccepting.sin_addr.S_un.(S_un_b[3]);

				param->nIndex = intBoardIdx - 10; /*得到板卡编号*/
				param->s = AcceptSocket;
                
				/*产生事件*/
				g_EventArray[intBoardIdx - 11]  = WSACreateEvent();
				g_sockRecvSock[intBoardIdx - 11] = AcceptSocket;
				g_BoardIndexValid[intBoardIdx - 11] = 1;

				if (WSAEventSelect( AcceptSocket, g_EventArray[intBoardIdx - 11], FD_READ | FD_CLOSE)!=0)
				{
					printf("Event Select failed\n");
				}                

				/*更新等待事件数组*/
				g_EventArrayForWait[g_nSocknumAccepted] = g_EventArray[intBoardIdx - 11];

				/*连接数计数*/
				g_nSocknumAccepted++;

			}

#if 1       /*进行socket选项的设置*/
			int                     nTcpSockRcvBufSize;
			int                     nTcpSockRcvBufSizeParaLen = sizeof(int);
			getsockopt(AcceptSocket, SOL_SOCKET, SO_RCVBUF, (char*)(u32)&nTcpSockRcvBufSize, &nTcpSockRcvBufSizeParaLen);
			#ifdef DEBUG_PRINT_OUT
			printf("sock recv buffer len = %d\n, board id = %d", nTcpSockRcvBufSize, pParam->nIndex);
			#endif

    
			nTcpSockRcvBufSize = 0x100000 * 10;
			setsockopt(AcceptSocket, SOL_SOCKET, SO_RCVBUF, (char*)(u32)&nTcpSockRcvBufSize, nTcpSockRcvBufSizeParaLen);

			getsockopt(AcceptSocket, SOL_SOCKET, SO_RCVBUF, (char*)(u32)&nTcpSockRcvBufSize, &nTcpSockRcvBufSizeParaLen);
    
			#ifdef DEBUG_PRINT_OUT
			printf("sock recv buffer len = %d\n, board id after set = 0x%X", nTcpSockRcvBufSize, pParam->nIndex);
			#endif
    
			nTcpSockRcvBufSize = 0x100000 * 10;
			setsockopt(AcceptSocket, IPPROTO_TCP, SO_RCVBUF, (char*)(u32)&nTcpSockRcvBufSize, nTcpSockRcvBufSizeParaLen);

			/*no delay*/
			nTcpSockRcvBufSize = 1;
			setsockopt(AcceptSocket, IPPROTO_TCP, TCP_NODELAY , (char*)(u32)&nTcpSockRcvBufSize, nTcpSockRcvBufSizeParaLen);
#endif
			//if (g_nSocknumAccepted == 1)
			if (g_nSocknumAccepted == 1)
			{
				/*五个都连接之后,起接收任务*/
				//g_nSocknumAccepted = 0;
				handleChildThread = _beginthread(RecvImagesSocket,10240,(void *)0);
				SetThreadPriority((void*)handleChildThread, IMAGE_CURRENT_THREAD_PRIORITY);			
			}

		}
#endif
			
	} // while(1) 

	printf("OK\n");
	closesocket(RecvSocket);
	_endthread();
}

/*从TCP socket上接收指定长度的数据接收数据*/
SYS_STATUS IMAGE_RxTcpBuf(SOCKET sokcetRx, s8 *ps8Buf, u32 u32Len)
{
    s32                     s32RxedNumTotal = 0;
    s32                     s32RxedNumOnce = 0;

    if (INVALID_SOCKET != sokcetRx)
    {

        while ( s32RxedNumTotal < (int)u32Len)
        {
			s32RxedNumOnce = recv( sokcetRx, (char *)(u32)(ps8Buf + s32RxedNumTotal),  u32Len - s32RxedNumTotal, 0);
            if ( s32RxedNumOnce < 0)
            {
                closesocket(sokcetRx);    
                return (-1);
            }
            
            s32RxedNumTotal += s32RxedNumOnce;
        }

    }
    else
    {
        /*返回错误*/
        return (-1);
    }
    
    return (SYS_OK);
} /*End of function IMAGE_TxTcpBuf*/

/*通过事件来获得板卡的索引*/
int FindBoardIndex(WSAEVENT hEvent)
{
	int i;
	int nBoardIndex;


	for (i=0; i < IMAGE_CAMERA_NUM; i++)
	{
		if( (hEvent == g_EventArray[i]) && (hEvent != NULL) && (g_EventArray[i] != NULL)  )
		{
			return i;		
		}	
	
	}

	if (i == IMAGE_CAMERA_NUM)
	{
		return -1;	
	}

}


	
/*******************************************************************************************************\
该函数用用于接收图像采集计算机发来的图像数据
\*******************************************************************************************************/
void RecvImagesSocket(void *arg)
{
#if 1 /*进行非阻塞得接收*/
	char                    *buf[IMAGE_CAMERA_NUM];
	WSAEVENT EventArray[1];
	int nReceiveTotal[IMAGE_CAMERA_NUM] = {0, 0, 0, 0, 0};
	int nReceiveType = 0;
	int nMaxByte[IMAGE_CAMERA_NUM] = {0, 0, 0, 0, 0};
	int nFileSize[IMAGE_CAMERA_NUM] = {0, 0, 0, 0, 0};
	int nReceiveBytes = 0;
	FILE *f=NULL;
	int nFileIndex = 1;
	int i=0;
	EventArray[0] = WSACreateEvent();
    int  nWaitMultipleReturn;
	int  nWaitEventIndex = 0;
    
	/*用来计算是否还有socket没有关闭,如果全部socket都关闭了,那么关闭此线程*/
	int nConnectedSockNum = 1;

	/*同步socket 接收同步flag*/
	int nSyncFlag[IMAGE_CAMERA_NUM] = {0, 0, 0, 0, 0};

	int                     bufHead[IMAGE_CAMERA_NUM][4];
	int                     nTcpSockRcvBufSize;
	int                     nTcpSockRcvBufSizeParaLen = sizeof(int);
	s32						s32Ret = 0;

	int                     nBoardIndex;


	/*等待1秒钟等待所有的socket接入*/
	Sleep(1000);

	printf("g_nSocknumAccepted = %d\n", g_nSocknumAccepted);

	while (1)
	{
		//if (  (nWaitMultipleReturn = WSAWaitForMultipleEvents(IMAGE_CAMERA_NUM, g_EventArray,TRUE,10000,FALSE))==WAIT_TIMEOUT)
		
		/*在所有的事件上等待*/
        if (  (nWaitMultipleReturn = WSAWaitForMultipleEvents(1, &g_EventArrayForWait[nWaitEventIndex], TRUE, 0, FALSE)) == WAIT_TIMEOUT)
		{
            nWaitEventIndex++; 
			nWaitEventIndex %= g_nSocknumAccepted; 
			continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -