C语言 调试断言失败。表达式(流!=NULL)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17037458/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Debug Assertion Failed. Expression (stream !=NULL)
提问by Ayse
I am getting the following error:
我收到以下错误:
Debug Assertion Failed. Expression (stream !=NULL) File: f:\dd\vctools/crty_bld/self_x86\crt\src\fwrite.c
调试断言失败。表达式(流!=NULL)文件:f:\dd\vctools/crty_bld/self_x86\crt\src\fwrite.c
and CPU Usage 100% when 4 threads are created. The Code works fine initially for sometime and then gives this error.
创建 4 个线程时 CPU 使用率 100%。该代码最初可以正常工作一段时间,然后出现此错误。
The code is a UDP single Server/multiple Client application using WSAWaitforMultipleEvents().
该代码是一个使用 WSAWaitforMultipleEvents() 的 UDP 单服务器/多客户端应用程序。
EDIT:
编辑:
Debugger triggers a breakpoint in fwrite.c
调试器在 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);
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);
All the files are in one single folder which are openend using fopen(). When only two files are opened, it works fine but for more than two files, error occurs.
所有文件都在一个文件夹中,使用 fopen() 打开。当只打开两个文件时,它工作正常,但如果打开两个以上的文件,则会发生错误。
The code is too long so I don't know which part should I share :(
代码太长,所以我不知道我应该分享哪一部分:(
Actually there are 3 ReceiveThreads and each Receive Thread ahas its own sendThread.
实际上有 3 个接收线程,每个接收线程都有自己的发送线程。
Receive Thread only keeps on receiving a buffer and keep writing to a text file. If EOF or EXIT is received, the receivethread should terminate itself and its SendThread as well.
接收线程只继续接收缓冲区并继续写入文本文件。如果收到 EOF 或 EXIT,则接收线程应终止其自身及其 SendThread。
Send Thread on the other hand onlly keeps on reading from text file and keeps sending at socket.
另一方面,发送线程仅继续从文本文件中读取并继续在套接字上发送。
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;
}
// ===============================================================================================================
采纳答案by xaxxon
You need to check
你需要检查
FILE *fprecv = fopen(TEXT(file),"wb");
to make sure it didn't return an error. Also, pleasefix your indentation. The logic is very hard to follow.
以确保它没有返回错误。另外,请修复您的缩进。这个逻辑很难遵循。

