4

私の次のコードは正常にコンパイルされ、40 のクライアントを処理するために完全に実行されますが、しばらくすると、「Debug Assertiion Failed expression: (_osfile(fh) & fopen)」というエラーが表示されます。

私はインターネットで検索し、解決策を見つけました:

プロジェクト + プロパティ、構成プロパティ、C/C++、コード生成、ランタイム ライブラリを「マルチスレッド DLL (/MD)」に変更 (または /MT を使用)。

現在、Debug Assertion Failed エラーは表示されていませんが、エラーは「Fatal error at line fwrite()」になっています。参照用にコードでこの行を強調表示しました。

なぜこれが起こるのか教えてください。私が犯した間違いは何ですか?ハマった :(

長いコードで申し訳ありません。

コード:

   DWORD WINAPI ThreadProc(LPVOID param)
        {
           int threadNumber= (int)param;
           int PORT = 8888+threadNumber; //so that each thread bind()s its socket to a different Port number.
           WSADATA wsa; 

           //Initialise winsock//
           if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
              {

                //"WinSock Initialization FAILED",

              }

           //Create a socket//

          SOCKET newSocketIdentifier;
          SOCKADDR_IN newSocket;

          if((newSocketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
              {                 

                //Socket Creation Failed

              }
           //Socket Created//

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

           //Bind//
           if( bind(newSocketIdentifier ,(struct sockaddr *)&newSocket, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
              { 
               //Bind Failed
              }

           //Bind Done//   char threadNumberBuffer[32] = "Thread Number : ";
   char threadNumberBuffer[32] = "Thread Number : ";
   char buff[12];
   itoa(threadNumber,buff,10);
   strcat(threadNumberBuffer,buff);
   /*MessageBox( NULL,
               threadNumberBuffer,
               "Thread Created :)",
               MB_ICONINFORMATION);*/


char data[256];
int bytes, waitRet;

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

SOCKADDR_IN clientSocket;
int clientSocketLength = sizeof(SOCKADDR_IN);
char receiveBuffer[8192]={0};
int recv_len=0;
char file[128]="Client";
char threadno[32];
itoa(threadNumber,threadno,10);
strcat(threadno,".txt");
strcat(file,threadno);
//FILE *fprecv;
FILE *fprecv = fopen(TEXT(file),"w+b");
rewind(fprecv);
int receiveCount=0;

   while(1)
      {   //while(1) starts
         waitRet = WSAWaitForMultipleEvents(1, &hEvent, FALSE, WSA_INFINITE, FALSE);
         //WSAResetEvent(hEvent);
         if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
            {
               MessageBox( NULL,
                           threadNumberBuffer,
                           "FAILURE",
                           MB_ICONINFORMATION);
            }
        else
            {   //else event occurred starts
               if(events.lNetworkEvents & FD_READ)
                  {   //check for network event starts
                     /*MessageBox( NULL,
                                 buf,
                                 "FD_READ",
                                 MB_ICONINFORMATION);*/

                     if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
                        {
                           MessageBox( NULL,
                                       "ERROR",
                                       "Could not Receive Data",
                                       MB_ICONINFORMATION);
                           exit(EXIT_FAILURE);
                           return FALSE;
                        }
                     receiveCount = receiveCount+1;
                     char display[2000] = "Number of Receives = ";

                    if(memcmp(receiveBuffer,"EXIT",4) == 0)
                        {
                            char receiveCountBuffer[1000];
                            itoa(receiveCount,receiveCountBuffer,10);
                            strcat(display,receiveCountBuffer);
                            MessageBox( NULL,
                                        display,
                                        threadNumberBuffer,
                                        MB_ICONINFORMATION);
                            break;
                            //return FALSE;
                        }
                /*MessageBox( NULL,
                            receiveBuffer,
                            "File Read",
                            MB_ICONINFORMATION);*/
                    else
                    {
                          //fprecv= freopen(TEXT(file),"w+b",stdout);
                           **if(fwrite(receiveBuffer, 1, recv_len, fprecv)<0)** //Fatal Error here
                              {
                                 MessageBox( NULL,
                                             "problem while writing file",
                                             "Error!",
                                             MB_ICONINFORMATION);

                                 exit(1);
                              }
                           //fclose(fprecv);
                    }
                          /* MessageBox( NULL,
                                       "Written",
                                       "Success",
                                       MB_ICONINFORMATION);*/
                           rewind(fprecv);
               }   //check for network event ends
            }   //else event occurred ends
      }   //while(1) ends

    WSACloseEvent(hEvent);
    return 0;
}
4

0 に答える 0