📄 testimagegrab.cpp
字号:
#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 + -