3

我收到以下错误:

调试断言失败。表达式(流!=NULL)文件:f:\dd\vctools/crty_bld/self_x86\crt\src\fwrite.c

当创建 4 个线程时,CPU 使用率为 100%。该代码最初可以正常工作一段时间,然后出现此错误。

该代码是使用 WSAWaitforMultipleEvents() 的 UDP 单服务器/多客户端应用程序。

编辑:

调试器在 fwrite.c 中触发断点

  if(size ==0 || count == 0)
        return 0;

    // just checking for stream != NULL here
    // rest of the validation is in _fwrite_nolock()
    **_VALIDATE_RETURN( (stream != NULL) ,EINVAL, 0);** /*Debugger triggered a break point here*/

    _lock_str(stream);

所有文件都在一个使用 fopen() 打开的文件夹中。当仅打开两个文件时,它可以正常工作,但对于两个以上的文件,则会发生错误。

代码太长了,不知道应该分享哪一部分:(

实际上有 3 个接收线程,每个接收线程都有自己的发送线程。

接收线程仅继续接收缓冲区并继续写入文本文件。如果收到 EOF 或 EXIT,则接收线程应终止自身及其 SendThread。

另一方面,发送线程只继续从文本文件中读取并继续在套接字上发送。

DWORD WINAPI sendAllThreadProcedure(LPVOID param)
{
   threadDetailStruct* myDetailStruct =  (threadDetailStruct*) (param);
   int threadNumber,portNumber;
   char *ipNumber;
   SOCKADDR_IN sendSocket = myDetailStruct->cliSock; 
   SOCKET sendSocketIdentifier = myDetailStruct->cliSockIdentifier;
   threadNumber = myDetailStruct->threadNum;


   char clientPort[32],*clientIP = inet_ntoa(sendSocket.sin_addr);
   int cliPort = ntohs(sendSocket.sin_port);
   itoa(cliPort,clientPort,10);
//=======================================================================
   int clientSocketLength = sizeof(SOCKADDR_IN);
   char receiveBuffer[10000];
   int recv_len=0;
//=======================================================================


   char file[32]="File.txt";
   int sendCount=0;
   FILE *fpSend;
    while(1)
    {
    if(WaitForSingleObject(terminate_thread_event[threadNumber],0) == WAIT_OBJECT_0)
       {
          ResetEvent(terminate_thread_event[threadNumber]);
          break;
       }
    if((fpSend = fopen(TEXT(fileName), "r+b")) == NULL)
    {
       //"Unable to open the File"
       continue;
    }
   else
   {
    char file_buffer[10000];
    int bytes_read=0;
    char new_buffer[1000] = "FILE",send[1000];
    if(sendto(sendSocketIdentifier, new_buffer, sizeof(new_buffer), 0, (struct sockaddr *) &sendSocket, sizeof(sendSocket))<0)
    {
     //FILE MEssage NOT SENNT!"
     continue;
    }
     else
     {
      while(fpSend!=NULL)
      {
       if(WaitForSingleObject(terminate_thread_event[threadNumber],0) == WAIT_OBJECT_0)
       {
        ResetEvent(terminate_thread_event[threadNumber]);
            closesocket(sendSocketIdentifier);
        fclose(fpSend);
        return 0;
       }
       if((bytes_read=fread(file_buffer, sizeof(char), 5, fpSend))<=0)
       {
        if(feof(fpSend))
        {
           char new_buffer[1000] = "EOF",send[1000],exit_message[12];
               if(sendto(sendSocketIdentifier, new_buffer, sizeof(new_buffer), 0,  (struct sockaddr *) &sendSocket, sizeof(sendSocket))<0)
           {
                 //"EOF NOT SENNT!"
                 break;
           }
               fclose(fpSend);
               break;
        }
        else
        {
           /*Unable to copy file into buffer*/
                fclose(fpSend);
            break;
        }
       }
      else
      {
        if(sendto(sendSocketIdentifier, file_buffer, bytes_read, 0, (struct sockaddr *) &sendSocket, sizeof(sendSocket))<0)
        {
             //"Bytes read from File NOT SENT!"
             fclose(fpSend);
         break;
        }
        else
        {
           sendCount = sendCount+1;
        }
      }
    }
  }
Sleep(100);
   closesocket(sendSocketIdentifier);
   return 0;
}

// ====================
// RECEIVE Thread
DWORD WINAPI newrecvThreadProcedure(LPVOID param)
{
   newRecvThreadDetailStruct* myDetailStruct =  (newRecvThreadDetailStruct*) (param);
char newDetail[256], threadNumber_char[12], ipNumber[32],
*detail = myDetailStruct>newsocketDetail;
   int portNumber,threadNumber_int = myDetailStruct->threadNum; 
   sscanf(detail,"%s %d",ipNumber,&portNumber);
   itoa(threadNumber_int,threadNumber_char,10);

   strcpy(newDetail,threadNumber_char);
   strcat(newDetail," ");
   strcat(newDetail,detail);
   struct node *cur, *newNode;

   EnterCriticalSection(&cs);
   cur =cread();
   cur->data = newDetail;
   cur->n=NULL;
   push(cur);
   newNode = pop();
   MessageBox( NULL,"PUSH DONE!","PUSH!",MB_ICONEXCLAMATION | MB_OK);
   if  (ResetEvent(data_available_event) == 0) // signal sender thread that data is available
      {
          MessageBox( NULL,"RESET Event is not Set","Failed!",MB_ICONEXCLAMATION | MB_OK);
      }
   LeaveCriticalSection(&cs);

   char file[64] = client.txt;

   //====================================================================
   // Creating New Socket Now
      WSADATA wsa; 

   //Initialise winsock//
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
         char err[128];
         itoa(WSAGetLastError(),err,10);
         MessageBox( NULL,
                     err,
                     "WinSock Initialization FAILED",
                     MB_ICONINFORMATION);
         exit(EXIT_FAILURE);
      }

   //Create a socket//
   SOCKET newSocketIdentifier;
   SOCKADDR_IN newSocket;
   if((newSocketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      { 
        // "Socket Creation Failed",
         exit(EXIT_FAILURE);
      }
   //Socket Created//

   //Prepare the sockaddr_in structure//
   newSocket.sin_family = AF_INET;
   newSocket.sin_addr.s_addr = INADDR_ANY;
   newSocket.sin_port = htons(portNumber);

   //Bind//
   if( bind(newSocketIdentifier ,(struct sockaddr *)&newSocket, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
      { 
                     //"BIND FAILED inside Thread"
      }

   //Bind Done//

   int waitRet;
   WSAEVENT hEvent = WSACreateEvent();
   WSANETWORKEVENTS events;
   WSAEventSelect(newSocketIdentifier, hEvent, FD_READ | FD_WRITE);

   SOCKADDR_IN clientSocket;
   int clientSocketLength = sizeof(SOCKADDR_IN);
   char receiveBuffer[3000]={0};
   int recv_len = 0,receiveCount = 0;

   while(1)
      {
         waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, INFINITE, FALSE);
         //WSAResetEvent(hEvent);
         if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
            {
                         //"FAILURE"

               continue;
        }
         else
        {  //else event occurred starts
           if(events.lNetworkEvents & FD_READ)
               {
                 if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
                        {
                           continue;
                        }
                     else
                        {
                           if(memcmp(receiveBuffer,"NewSocket",9) == 0)
                              {
                                 if(sendto(newSocketIdentifier, "NewSocket ACK", sizeof("NewSocket ACK"), 0, (struct sockaddr *) &clientSocket, sizeof(clientSocket))<0)
                                    {
//"NewSocket ACK not SENNT!",err,MB_ICONEXCLAMATION | MB_OK);
                                       continue;
                            }
                         else
                            {
                                    break;
                            }
                     }
                }
            }
        }
      }
   threadDetailStruct threadDetail;
   threadDetail.cliSock = clientSocket;
   threadDetail.cliSockIdentifier = newSocketIdentifier;
   threadDetail.threadNum = threadNumber_int;
   AHN_glb_sendAllThreadHandle[threadNumber_int] = CreateThread( NULL,
                                                          0,
                                                          sendAllThreadProcedure,
                                                          (LPVOID)&threadDetail,
                                                          0,
                                                          &idThread[threadNumber_int]
                                                        );
   while(1)
      {
         waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, INFINITE, FALSE);
         //WSAResetEvent(hEvent);
         if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
            {
                          // "FAILURE"
               continue;
        }
        else
        {  //else event occurred starts
           if(events.lNetworkEvents & FD_READ)
             {  //check for network event starts
                     //FD_READ
                     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
                        {
//"after FD READ Could not Receive Data"

                            continue;
                    }

                if(memcmp(receiveBuffer,"EXIT",4) == 0)
                    {
                               SetEvent(terminate_thread_event[threadNumber_int]);
                    }
                if(memcmp(receiveBuffer,"FILE",4) == 0)
                    {
                     FILE *fprecv = fopen(TEXT(file),"wb");
                    while(1)
                    {
                        waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, 0, FALSE);
                              if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
                        {
                                          fclose(fprecv);
                                          break;
                        }
                        else
                        { 
                                          if(events.lNetworkEvents & FD_READ)//else event occurred starts
                          {
                                                if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
                                                      {                                   MessageBox( NULL,"error","Data Reception Failed",MB_ICONINFORMATION);
                                                      fclose(fprecv);
                                                      exit(EXIT_FAILURE);
                                                      break;
                                      }
                                                receiveCount = recv_len+receiveCount;
                                    if(memcmp(receiveBuffer,"EXIT",4) == 0)
                                    {
                                    SetEvent(terminate_thread_event[threadNumber_int]);
                                    fclose(fprecv);
                                    return 0;
                                    }
                                                if(memcmp(receiveBuffer,"EOF",3) == 0)
                                                   {
                                                      fclose(fprecv);
                                                      break;
                                                   }
                                                if(memcmp(receiveBuffer,"FILE",4) == 0)
                                                   {
                                                      fclose(fprecv);
                                                      remove(TEXT(file));
                                                      fprecv = fopen(TEXT(file),"wb");
                                                      continue;
                                                   }
                                                **if(fwrite(receiveBuffer, 1, recv_len, fprecv)<0)
                                                   {
                                                      MessageBox( NULL,"problem while writing file","Error!",MB_ICONINFORMATION);
                                                      fclose(fprecv);
                                                      break;
                                                   }**
                                             } //if FD_READ 
                                       }// else network event receievd ENDS
                                 }// While(1) for receiveing File Ends
                                          FILE *fp1 ;
                                          if((fp1 = fopen(TEXT(file), "rb")) == NULL)
                                             {
                                                MessageBox( NULL,"Unable to open the File","Error!",MB_ICONEXCLAMATION |MB_OK);
                                                break;
                                             }
                                          char filecmp[1000];
                                          strcpy(filecmp,"Client");
                                          strcat(filecmp,threadNumber_char);
                                          strcat(filecmp,"Original");
                                          strcat(filecmp,".txt");
                                          FILE *fp2 ;
                                          if((fp2 = fopen(TEXT(filecmp), "rb")) == NULL)
                                             {
                                                 MessageBox( NULL,"Unable to open the Original File","Error!",MB_ICONEXCLAMATION | MB_OK);
                                                 break;
                                             }
                                          int ch1  =  getc( fp1 ) ;
                                          int ch2  =  getc( fp2 ) ;
                                          while( (ch1!=EOF) && (ch2!=EOF) && (ch1 == ch2))
                                             {
                                                ch1 = getc(fp1);
                                                ch2 = getc(fp2) ;
                                             }
                                          char display[3000];
                                          strcpy(display,file);
                                          strcat(display," Received and ");
                                          strcat(display,filecmp);
                                          int idx=GetWindowTextLength(AHN_glb_resultWindowHandle);
                                          SendMessage(AHN_glb_resultWindowHandle,EM_SETSEL,idx,idx);
                                          SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)"\r\n");
                                          if (ch1 !=  ch2)
                                             {
                                                SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)"\r\n");
                                                SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)" ");
                                                SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)TEXT(display));
                                                SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)" are Not Identical");
                                             }
                                          else if (ch1 == ch2)
                                             {
                                                 SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)"\r\n");
                                                 SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)" ");
                                                 SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)TEXT(display));
                                                 SendMessage(AHN_glb_resultWindowHandle,EM_REPLACESEL,0,(LPARAM)" are Identical");
                                             }

fclose ( fp1 );
fclose ( fp2 );

                            } //if memecmp == FILE ENDS
                } //if FD_READ ENDS
            }// else if event occurred ENDS
    }//while(1) ENDS
   return 0;
}
// ===============================================================================================================
4

1 回答 1

3

你需要检查

FILE *fprecv = fopen(TEXT(file),"wb");

以确保它没有返回错误。另外,修正你的缩进。逻辑非常难以理解。

于 2013-06-11T06:48:17.243 回答