创建:
BOOL CMySock::Create(int port, int type)
{
struct sockaddr_in addr;
m_sock = socket(AF_INET, type, 0);

ZeroMemory(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(m_sock, (sockaddr*)&addr, sizeof(addr)) != 0)
return FALSE;
listen(m_sock, 5); struct sockaddr ad;
int len = sizeof(struct sockaddr);

do
{
Sleep(1);
SOCKET msgsock = accept(m_sock, (struct sockaddr*)&ad, (int*)&len);
if(msgsock != -1)
{
SECURITY_ATTRIBUTES ThreadAttributes;
ThreadAttributes.nLength = sizeof(ThreadAttributes);
ThreadAttributes.lpSecurityDescriptor = NULL;
ThreadAttributes.bInheritHandle = FALSE; CSockS* s = new CSockS(msgsock);
m_hanT = CreateThread(&ThreadAttributes, 0,
ThreadAcceptProc, s, 0,
&m_nTId);
CloseHandle(m_hanT);
}
}while(m_accept);
return TRUE;
}//线程
DWORD WINAPI ThreadAcceptProc(LPVOID lpParameter)
{
CSockS* p = (CSockS*)lpParameter;
p->OnRetrieve();
delete p; ExitThread(0);
return 0;
}//函数
void CSockS::OnRetrieve()
{
struct linger li;
li.l_linger = 2;
li.l_onoff = 2;
setsockopt(m_sock, SOL_SOCKET, SO_LINGER, (char*)&li, sizeof(struct linger));
char nType[2];
char* pmsg;
char buf[1024];
int nLen, offset; int re;
do
{
offset = 0;
re = recv(m_sock, nType, 1, 0);
if(re == 0)
break;
//return 0;
switch(nType[0])
{
case ADD_USER:
nLen = sizeof(struct CUserInfo);
//printf("add user nLen :%d\n", nLen);
  break;
default:
printf("else Len :%d\n", nLen);
continue;
break;
}
pmsg = new char[nLen];
pmsg = (char*)malloc(nLen);
re = recv(m_sock, buf, nLen, 0);
if(re > 0)
{
memcpy(pmsg, buf, re);
offset += re;
while(nLen != re)
{
printf("whiel start nLen %d : re: %d\n", nLen, re);
nLen -= re;
re = recv(m_sock, buf, nLen, 0);
if(re <= 0)
{
printf("read over\n");
delete pmsg;
goto Ex;
//break;
}
memcpy(pmsg + offset, buf, re);
offset += re;
printf("whiel over nLen %d : re: %d\n", nLen, re);
}
HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44");
WaitForSingleObject(hCounterIn,INFINITE);
PeekMsg(nType[0], pmsg);
ReleaseMutex(hCounterIn);
CloseHandle(hCounterIn);
}
delete pmsg;
}while(re > 0);
Ex:
shutdown(m_sock, SD_RECEIVE);
}
//问题:
1。执行不稳定。
2。是不是创建线程的方法不对?创建后直接closehandle()会有什么影响??

解决方案 »

  1.   

    创建线程后关闭线程有两种方法,一是在别的地方调用closehandle,不过不提倡这样,二是让线程自己结束。象你那样的结束方法当然不能期望好的结果。
      

  2.   

    很简单了,你设置一个事件
    HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "NAME");
    在while里再加上
    if( WaitForsingleObject( hEvent, 0 ) != WAIT_OBJECT_0)
    {
    //Some End Work;
       return -1;
    //Or break;
    }
    在要退出线程的时候,在任何地方写SetEvent(hEvent);线程都会退出了!
      

  3.   

    创建后直接closehandle()不会有有什么影响,只不过表示你的程序和该线程没有联系了,先成返回后直接毁掉。但是,ExitThread(0); 就没有必要了。
    还有,在win32下,建议用AfxBeginThread
      

  4.   

    see this,maybe help you.
    http://www.vckbase.com/document/viewdoc.asp?id=349
      

  5.   

    最好使用异步事件处理,否则用do...while循环很消耗系统资源的
      

  6.   

    建议你这样做
    我做过一个程序
    效果很好
    可以支持几百个线程连接
    但是我现在在网吧
    无法给你贴代码你开始就创建一个线程
    假设你的线程函数是  MyThreadProc
    在这个线程函数里的accept里阻塞监听
    当有连接上来后
    马上启动一个新的MyThreadProc线程,让这个新的线程去监听别的请求;
    然后你这个当前线程就处理你的当前这个连接