我一直在使用套接字编程实现一个程序, 并且我遇到了错误消息" deque iterator不兼容"。
程序代码如下: 1.
while (1)
{
tmp_fds = read_fds;
printf("[Waiting Select Signal] \n");
if (select(maxfd + 1, &tmp_fds, 0, 0, (struct timeval *)0)<1)
{
perror("select error : ");
exit(1);
}
for (fd = 0; fd<maxfd + 1; fd++)
{
if (FD_ISSET(fd, &tmp_fds))
{
if (fd == ssock)
{
if ((csock = accept(ssock, (struct sockaddr *)&client_addr, &clen))<0)
{
perror("accept error : ");
exit(0);
}
FD_SET(csock, &read_fds);
printf(" - New client is connected = %d \n", csock);
stEpInfo[iEpCount].iFDNum = csock;
stEpInfo[iEpCount].sIpAddr = inet_ntoa(client_addr.sin_addr);
iEpCount++;
if (csock>maxfd)
{
maxfd = csock;
}
} else
{
printf(" - Received Client Socket Signal (FD = %d) \n", fd);
memset(&read_message, 0, sizeof(read_message));
data_len = recv(fd, (char*)&read_message, sizeof(read_message), 0);
CDataQueue::getDataQueue()->pushDataToQueue(read_message);
在此源代码中,服务器接收数据并将其抛入队列,并且每当服务器接收数据时都会反复发生这种情况。
线程正在努力查明数据是否已插入队列。如果插入数据(这意味着队列不为空),则将弹出数据。
unsigned WINAPI PreprocessInsert(void * data){
printf("[Thread Start] \n");
CDatabase *l_db = (CDatabase *)data;
int cnt = 0;
int iECount = 0;
ST_CCT stCCT;
while (1){
if (!CDataQueue::getDataQueue()->getQueue().empty()){ ST_MONITORING_RESULT poppedData = CDataQueue::getDataQueue()->popDataFromQueue();}
我像这样编写了与队列相关的代码。
void CDataQueue :: pushDataToQueue(ST_MONITORING_RESULT data){
::EnterCriticalSection(&m_stCriticalSection);
m_deQueue.push_back(data);
::LeaveCriticalSection(&m_stCriticalSection);
}
ST_MONITORING_RESULT CDataQueue :: popDataFromQueue(){
::EnterCriticalSection(&m_stCriticalSection);
ST_MONITORING_RESULT data = m_deQueue.front();
m_deQueue.pop_front();
::LeaveCriticalSection(&m_stCriticalSection);
return data;
}
当程序运行时,有时&#34; deque迭代器不兼容&#34;弹出消息,有时不弹出。当我对程序执行调试时,我看到收到的数据在队列中,但if (!CDataQueue::getDataQueue()->getQueue().empty())
语句不起作用。
我不明白发生了什么。任何帮助表示赞赏!