创建:
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()会有什么影响??
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()会有什么影响??
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "NAME");
在while里再加上
if( WaitForsingleObject( hEvent, 0 ) != WAIT_OBJECT_0)
{
//Some End Work;
return -1;
//Or break;
}
在要退出线程的时候,在任何地方写SetEvent(hEvent);线程都会退出了!
还有,在win32下,建议用AfxBeginThread
http://www.vckbase.com/document/viewdoc.asp?id=349
我做过一个程序
效果很好
可以支持几百个线程连接
但是我现在在网吧
无法给你贴代码你开始就创建一个线程
假设你的线程函数是 MyThreadProc
在这个线程函数里的accept里阻塞监听
当有连接上来后
马上启动一个新的MyThreadProc线程,让这个新的线程去监听别的请求;
然后你这个当前线程就处理你的当前这个连接