草庐IT

c - 调试断言失败。表达式(流!= NULL)

coder 2024-06-05 原文

我收到以下错误:

Debug Assertion Failed. Expression (stream !=NULL) File: 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 个 ReceiveThread,每个 Receive Thread 都有自己的 sendThread。

接收线程只持续接收缓冲区并持续写入文本文件。如果接收到 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;
}
// ===============================================================================================================

最佳答案

你需要检查

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

确保它没有返回错误。另外,修正您的缩进。这个逻辑很难理解。

关于c - 调试断言失败。表达式(流!= NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17037458/

有关c - 调试断言失败。表达式(流!= NULL)的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  4. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  5. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  6. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  7. "\0"null 的 Ruby 测试? - 2

    我在破坏脚本的字符串中出现了一些奇怪的字符。据我所知,通过putbadstring到控制台,它们是"\0\0\0\0"。我想对此进行测试,以便我可以忽略它们...但是如何呢?以为这就是blank?和empty?的用途?!?:>badstring="\0"=>"\u0000">badstring.blank?NoMethodError:undefinedmethod`blank?'for"\u0000":Stringfrom(irb):97from/Users/meltemi/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in`'>badstring.em

  8. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  9. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  10. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

随机推荐