UINT listenThread(void *p)
{
CMyserver *pServer = (CMyserver*)p;
while (true)
{
if (pServer->m_bStop)
{
AfxEndThread(0);
return 0;
}
ASSERT(pServer != NULL);
CString sEr;
int nEr;
sockaddr_in clientAddr;
int addrlen = sizeof(clientAddr);
u_long ul = 1;
//ioctlsocket(pServer->m_socket, FIONBIO, &ul);
SOCKET s = accept(pServer->m_socket, (sockaddr*)&clientAddr,  &addrlen);//還有我想問下,多點傳輸一個文件是不是要在這裡做下文章.
if (s == SOCKET_ERROR)
{
if (pServer->m_bStop)
{
break;
}
else
{
sEr.Format("accept Error %d !", nEr = WSAGetLastError());
AfxMessageBox(sEr);
return 0;
}
}
CString clientIp = inet_ntoa(clientAddr.sin_addr);
pServer->m_sClientip= clientIp;
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(s, &fdread);
timeval timer;
timer.tv_sec = 2;
timer.tv_usec = 0;
switch(select(NULL, &fdread, NULL, NULL, &timer))
{
case -1:
return 0;
case 0:
break;
default:
if (FD_ISSET(s, &fdread))
{
if (pServer->Recv(s))
{
pServer->m_bStop = TRUE;
}
}
}  
}
return -1;
}
bool CMyserver::Recv(SOCKET s)
{
CString sMsg;
char *buff =  new char[1024];
memset(buff, 0, 1024); int nlen;
nlen = recv(s, (char*)buff, 1024, 0);

CString sfileName;
char *temp = new char[1024];
int i = 0; 
for (;i < 1024; i++)
{
if (buff[i] =='*')
{
break;
}
temp[i] = buff[i];
}
temp[i++] = '\0'; sfileName.Format("%s", temp);//文件名
memset(temp, 0, 1024);
strcpy(temp, buff + i);
int nfilelen = atoi(temp);//文件長度
//如果這裡加上 sfileName = "ab.h" 就不會出錯,
CFile file(sfileName, CFile::modeCreate|CFile::modeWrite);//出錯, 但sfileName有值.
m_sMsg = sfileName;
while (true)
{
CString str;
nlen = recv(s, buff, 1024, 0);
str = buff;
str.TrimLeft();
str.TrimRight();
sMsg += str;
if ( nlen == 0)
{
break;
}
file.Write(buff, nlen);
}
closesocket(s);
m_bAceept = true;
file.Close(); delete[] temp;
delete[] buff;
return true;
}