客户端程序由100个线程,每个线程分别于服务器连接通信,不停地send与serv
服务器定义了100个线程,分别对应接收客户端sock,线程里sevr,send循环
现在的问题是弹出取指溢出错误,
感觉像是服务器超过了100个线程,
MessageBox(NULL,"access","notify",0);
有时候弹出了access对话框。有点长,不好意思
请大家帮我看一下
for (i=0;i<THREAD_NUM;i++)
{
iAddrSize = sizeof(client);
sClient[i] = accept(sListen, (struct sockaddr *)&client,
&iAddrSize);
if (sClient[i] == INVALID_SOCKET)
{
printf("accept() failed: %d\n", WSAGetLastError());
continue;
}
if (i>100)
{
MessageBox(NULL,"access","notify",0);
}
printf("Accepted client: %s:%l\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread[i] = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient[i], 0, &dwThreadId[i]);
if (hThread[i] == NULL)
{
printf("CreateThread() failed: %d\n", GetLastError());
continue;
}
}
while(1);
服务器定义了100个线程,分别对应接收客户端sock,线程里sevr,send循环
现在的问题是弹出取指溢出错误,
感觉像是服务器超过了100个线程,
MessageBox(NULL,"access","notify",0);
有时候弹出了access对话框。有点长,不好意思
请大家帮我看一下
for (i=0;i<THREAD_NUM;i++)
{
iAddrSize = sizeof(client);
sClient[i] = accept(sListen, (struct sockaddr *)&client,
&iAddrSize);
if (sClient[i] == INVALID_SOCKET)
{
printf("accept() failed: %d\n", WSAGetLastError());
continue;
}
if (i>100)
{
MessageBox(NULL,"access","notify",0);
}
printf("Accepted client: %s:%l\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread[i] = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient[i], 0, &dwThreadId[i]);
if (hThread[i] == NULL)
{
printf("CreateThread() failed: %d\n", GetLastError());
continue;
}
}
while(1);
THREAD_NUM 是多少? 100,如果是100的话,你在循环里面加那个if(i> 100) 是不信任for的意思么如果THREAD_NUM超过100,那就正常了。
===========================================
现在的问题是弹出取指溢出错误, 上代码。
事件函数
info.sheet0 = &m_disDlg.m_grid;
info.pserver=&server;
info.message=m_message;
b_flag=true;
for ( j=0;j<THREAD_NUM;j++)
{
m_count=j;
info.count = m_count+1;
hthread[j]=AfxBeginThread(ThreadFunc,(LPVOID)&info);
Sleep(20);
}
处理线程:
UINT ThreadFunc(LPVOID pinfo)
{
threadinfo* m_pinfo=(threadinfo*)pinfo;
CMSFlexGrid* p_sheet=m_pinfo->sheet0;
struct sockaddr_in* m_pserver=m_pinfo->pserver;
CString m_message=m_pinfo->message;
int m_count=m_pinfo->count;
char buf[BUFFER_SIZE];
CString m_str;
int ret;
int loop=0; m_str.Format("%d",m_count);
p_sheet->SetTextMatrix(m_count,0,m_str); SOCKET client;
client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (client==INVALID_SOCKET)
{
p_sheet->SetTextMatrix(m_count,1,"failed");
}
p_sheet->SetTextMatrix(m_count,1,"succeed"); if(connect(client,(struct sockaddr *)m_pserver,sizeof(*m_pserver))==SOCKET_ERROR)
{
m_str.Format("%d",WSAGetLastError());
p_sheet->SetTextMatrix(m_count,2,m_str);
}
p_sheet->SetTextMatrix(m_count,2,"succeed");
while (b_flag)
{
loop++;
if (send(client,m_message,strlen(m_message),0)==SOCKET_ERROR)
{
m_str.Format("%d-%d",loop,WSAGetLastError());
p_sheet->SetTextMatrix(m_count,3,m_str);
break;
}
m_str.Format("succed %d",loop);
p_sheet->SetTextMatrix(m_count,3,m_str);
if ((ret=recv(client,buf,BUFFER_SIZE,0))==SOCKET_ERROR)
{
m_str.Format("%d-%d",loop,WSAGetLastError());
p_sheet->SetTextMatrix(m_count,4,m_str);
break;
}
buf[ret]='\0';
CString str0,str1;
str0.Format("%d",loop);
str1.Format("%s",buf);
str1+=str0;
p_sheet->SetTextMatrix(m_count,4,str1);
Sleep(300);
}
closesocket(client);
return 1;
}
另外问题触发很随机,可能跑了10分钟或是多少才会触发,所以不好调试啊。
弹出对话框**指令引用的内存,该内存不能为written,取指错误了
又找不出来,按取消调试,对应的汇编也不知道对应到那一句程序上
望指点
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock=(SOCKET)lpParam;
char szBuff[DEFAULT_BUFFER];
int ret,
nLeft,
idx;
DWORD currentID;
while(1)
{
// Perform a blocking recv() call
//
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
if (ret == 0) // Graceful close
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
break;
}
if (ret>=1024)
{
MessageBox(NULL,"off","notify",0);
break;
}
szBuff[ret] = '\0';
currentID=GetCurrentThreadId();
printf("%d__ RECV: '%s'\n ",currentID, szBuff);
//
// If we selected to echo the data back, do it
//
if (!bRecvOnly)
{
nLeft = ret;
idx = 0;
//
// Make sure we write all the data
//
while(nLeft > 0)
{
ret = send(sock, &szBuff[idx], nLeft, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n",
WSAGetLastError());
break;
}
if (idx>17)
{
MessageBox(NULL,"idx",NULL,0);
}
nLeft -= ret;
idx += ret;
}
}
} return 0;
}
弹出的错误对话框指示的是服务器的问题,找不出是那句溢出了