在线程中使用CSOCKET的问题?

dolaime 2000-08-21 08:11:00
打开接受主线程:
接受第一个接入的线程一切OK,当有第二个线程接入时,出现断言错误:
Debug Assertion Failed!
programe c:\Server.exe
File : Sockcore.cpp
line:407
若忽略错误,能接受到接入的客户端,并能接受数据.
跟踪调试时:
错误定位在: ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);

请问以下代码有何问题,同时请教如何终止指定的接受线程?

接受主线程
if (g_sSocket.Create(9990) == SOCKET_ERROR)
{
AfxMessageBox("监控服务初始化失败!",MB_OK);
return 0;
}

if (g_sSocket.Listen() == SOCKET_ERROR)
{
AfxMessageBox("监控服务监听失败!",MB_OK);
return 0;
}

while (bRunFlag)
{
CClientSocket *pSocket = new CClientSocket;
if (!g_sSocket.Accept(*pSocket))
{
AfxMessageBox("接受客户端连接失败!",MB_OK);
delete pSocket;
return 0;
}
else
AfxBeginThread(Connect,(LPVOID)pSocket->m_hSocket);
}

新建立的接受线程

UINT Connect(LPVOID lPvoid)
{
SOCKET hSocket=(SOCKET) lPvoid;
CSocket *pSocket = new CSocket;
//AfxMessageBox("接受成功");
pSocket->Attach(hSocket);
char lpCmdBuf[20];
if (pSocket->Receive(lpCmdBuf,sizeof(lpCmdBuf)) == 20 )
AfxMessageBox(lpCmdBuf);
pSocket->Close();
delete pSocket;
return 0;
}
...全文
293 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2000-08-25
  • 打赏
  • 举报
回复
有点要说明的,这个例子里面不是象你说的那样工作的。是循环等待连接,但是不是新开线程建立连接,传给新线程的sock已经可以直接send/recv了。accept后的socket已经是连接好了的。
为每个连接分配一单独线程,主要是为了快速的响应客户请求,而且便于server管理客户。

坎坷的菜贩 2000-08-25
  • 打赏
  • 举报
回复
有没有搞错!怎么都喜欢让服务端循环等待连接,然后又另外开一个线程出来建立与客户端的连接?难道大家都对使用Socket消息很反感么?
Kevin_qing 2000-08-24
  • 打赏
  • 举报
回复
一个API的例子
int main(int argc, char **argv) {
SOCKET listen_socket,msgsock;
struct sockaddr_in local, from;
int fromlen;
WSADATA ws;


if (WSAStartup(0x101,&ws) == SOCKET_ERROR) {
fprintf(stderr,"WSAStartup failed with error %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
local.sin_family = AF_INET;
local.sin_addr.s_addr =INADDR_ANY;

local.sin_port = htons(8080);

listen_socket = socket(AF_INET,SOCK_STREAM ,0); // TCP socket

if (listen_socket == INVALID_SOCKET){
fprintf(stderr,"socket() failed with error %d\n",WSAGetLastError());
WSACleanup();
return -1;
}

if (bind(listen_socket,(struct sockaddr*)&local,sizeof(local) )
== SOCKET_ERROR) {
fprintf(stderr,"bind() failed with error %d\n",WSAGetLastError());
WSACleanup();
return -1;
}

if (listen(listen_socket,5) == SOCKET_ERROR) {
fprintf(stderr,"listen() failed with error %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
fromlen=sizeof(from);
while(1)
{
msgsock = accept(listen_socket,(struct sockaddr*)&from, &fromlen);
if (msgsock == INVALID_SOCKET) {
fprintf(stderr,"accept() error %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
printf("accepted connection from %s, port %d\n",
inet_ntoa(from.sin_addr),
htons(from.sin_port)) ;

/***
这里开线程操作socket
***/

}
}



关闭Server:
很簡單。
在程序中增加一 flag 表明是否可以结束server 线程。
当你需要退出时,server端先发一连接请求到本程序的listen口,listen线程就可以继续运行了,这时簡查flag,看是否关闭socket。
这样需要一个listen线程,和一个monitor线程。

Kevin_qing 2000-08-24
  • 打赏
  • 举报
回复
CClientSocket 是什么类型?应该是你自己定义的吧

我仔细的看了一下你的程序,发现有几个地方有错误

while (bRunFlag)
{
CClientSocket *pSocket = new CClientSocket;
if (!g_sSocket.Accept(*pSocket))
{
AfxMessageBox("接受客户端连接失败!",MB_OK);
delete pSocket;
return 0;
}
else
AfxBeginThread(Connect,(LPVOID)pSocket->m_hSocket); /*这里传的是pSocket->m_hSocket,那pSocket在那里delete的?
你直接把pSocket传过去不是更好?
*/
}

新建立的接受线程

UINT Connect(LPVOID lPvoid)
{
SOCKET hSocket=(SOCKET)lPvoid;
CSocket *pSocket = new CSocket;
//AfxMessageBox("接受成功");
pSocket->Attach(hSocket); //在这里出错的(应该是传了无效的参数進去)
char lpCmdBuf[20];
if (pSocket->Receive(lpCmdBuf,sizeof(lpCmdBuf)) == 20 )
AfxMessageBox(lpCmdBuf);
pSocket->Close();
delete pSocket;
return 0;
}
dolaime 2000-08-24
  • 打赏
  • 举报
回复
仍然有error:
接受第一个接入的线程一切OK,当有第二个线程接入时,出现断言错误
Kevin_qing 2000-08-24
  • 打赏
  • 举报
回复
搞错了,listen一次就可以了,呵呵
bugz 2000-08-24
  • 打赏
  • 举报
回复
真的么,我用CAsyncSocket就很好啊。

或者自己重新封装一下,做个类,比用API方便
Kevin_qing 2000-08-22
  • 打赏
  • 举报
回复
while ( SOCKET_ERROR != g_sSocket.Listen() )
{

CClientSocket *pSocket = new CClientSocket;
if (!g_sSocket.Accept(*pSocket))
{
AfxMessageBox("接受客户端连接失败!",MB_OK);
delete pSocket;
return 0;
}
else
AfxBeginThread(Connect,(LPVOID)pSocket->m_hSocket);
}
Accept前一定要listen,另外建议使用 API 方式写Socket 程序

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧