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;
}
解决方案 »
- 如何把图直接画到BMP文件中?
- 用过程 CoInitializeSecurity()不能返回正确得不到访问权限,请问该如解决!多谢,很急啊!
- 大家说一下使用VC2005的感受好吗?我看是否要到VC2005下编程序
- vc下如何设置CListCtrl的属性使得用户可以拷贝CListCtrl显示的信息,谢谢
- 我要新建一个进程打开一个chm帮助文档,但是不知道打开chm的exe是哪一个?
- 如何在visual c++ 中关联chm的相关页面
- 大侠都来看看!出了什么问题
- open( ,"select count(*) from xxx" ) 返回的count
- 如何给树的item加上说明?
- ATL 没选择支持MFC, COleDateTime用不了, 怎样处理DATE?
- 主界面为什么会消失??
- VC6:CGridListCtrl里面放个下拉列表,下拉列表里有若干的值。现在我想手动指定该下拉列表的值。但是有时能显示,有时不行。高手指点~
因為我的客戶端和服務器的程序在一個工程中,我在客戶端用CFileDialog打開的文件, 在中間我把路徑去除了只保留了文件名,而在服務器這邊,我保存為當前路徑(沒有再指定路徑),哪就和原文件在同一個路徑, 結論(個人認為):
當服務器這邊創建文件時,原文件還末關閉.因為文件相同無法覆蓋,所以出錯.