DWORD WINAPI CTransferDlg::SendFileProc(LPVOID lpParameter)//发送文件进程
{
DWORD dwIP = ((SENDPARAM*)lpParameter)->m_dwIP;
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(7000);
addrSrv.sin_addr.S_un.S_addr = dwIP; SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if(SOCKET_ERROR == connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
AfxMessageBox("Connect fail!");
return 0;
}
// connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
CString fileName;
fileName = myFile.GetFileName();
send(sockClient, fileName, fileName.GetLength()+1, 0);
char Recvstr[2];
memset(Recvstr, 0, 2);
recv(sockClient,Recvstr,2,0);
if(CString(Recvstr) == "N")
return 0; CString strLength;
UINT fileLength;
fileLength = myFile.GetLength();
strLength.Format("%d", fileLength);
send(sockClient, strLength, fileLength, 0);
// Sleep(1000);
Sleep(10);
// now send the file's data
char sendData[SEND_BUFFER_SIZE];
memset(sendData, 0, SEND_BUFFER_SIZE);
UINT LeftToSend = myFile.GetLength();
do
{
memset(sendData, 0, SEND_BUFFER_SIZE);
int sendThisTime, doneSoFar, buffOffset;
sendThisTime = myFile.Read(sendData, SEND_BUFFER_SIZE);
buffOffset = 0;
do
{
doneSoFar = send(sockClient, sendData + buffOffset, sendThisTime,0);
buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
LeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );
}
while(LeftToSend >0 );
/* UINT length_counter=0;
int sendLen;
while(length_counter<fileLength)
{
memset(sendData,0,SEND_BUFFER_SIZE);
sendLen = myFile.Read(sendData,SEND_BUFFER_SIZE);
send(sockClient,sendData,sendLen,0);
length_counter += sendLen ;
}*/
AfxMessageBox("Send Success!");
myFile.Close();
closesocket(sockClient);
return 1;
}DWORD WINAPI CTransferDlg::RecvConnProc(LPVOID lpParameter)
{
// if(bOpenFile == FALSE)
// return 0;
SOCKET sockSrv=((RECVPARAM *)lpParameter)->sock;
HWND hwnd=((RECVPARAM *)lpParameter)->hwnd;
SOCKADDR_IN addrClient;
SOCKET sockConn;
int len = sizeof(SOCKADDR);
// while(1)
// {
listen(sockSrv, 10);
sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
RECVPARAM *pRecvFileParam=new RECVPARAM;
pRecvFileParam ->sock = sockConn;
pRecvFileParam ->addr = addrClient;
HANDLE hReceFileThread = CreateThread(NULL, 0, RecvFileProc, (LPVOID)pRecvFileParam,
0, NULL);
CloseHandle(hReceFileThread);
// }
return 0;
}DWORD WINAPI CTransferDlg:: RecvFileProc(LPVOID lpParameter)//接收文件进程
{
// if(bOpenFile == FALSE)
// return 0;
SOCKET sockConn = ((RECVPARAM *)lpParameter)->sock;
SOCKADDR_IN addrClient = ((RECVPARAM *)lpParameter)->addr;
char filename[100];
memset(filename,0 ,100);
//reveive file's name
recv(sockConn,filename,100,0); CString RecvMsg;
RecvMsg.Format("%s send you -%s- Accept or Not?",inet_ntoa(addrClient.sin_addr),filename);
if(IDNO == ::AfxMessageBox(RecvMsg, MB_YESNO))
{
send(sockConn, "N", 2, 0);
return 0;
}
else
{
send(sockConn, "Y", 2, 0);
}
char strfileLen[32];
memset(strfileLen,0,32);
// Sleep(10);
recv(sockConn,strfileLen,32,0);
UINT filelen = atoi(strfileLen);
CFileDialog filedlg(false,NULL,filename);
if(IDCANCEL==filedlg.DoModal())
return 0;
CFile file;
file.Open(filedlg.GetFileName(),CFile::modeWrite|CFile::modeCreate|CFile::typeBinary);
// Sleep(5000);
char DataBuffer[SEND_BUFFER_SIZE];
memset(DataBuffer, 0, SEND_BUFFER_SIZE);
UINT length_counter = 0;
while(length_counter < filelen)
{
memset(DataBuffer, 0, SEND_BUFFER_SIZE);
int LengthReceived=0;
int totalReceived=0;
BOOL Continue = TRUE;
char* pDataBufferIndex = &DataBuffer[0];
while (Continue && (totalReceived < SEND_BUFFER_SIZE ))
{
LengthReceived =
recv(sockConn, pDataBufferIndex, (SEND_BUFFER_SIZE - totalReceived), 0);
switch(LengthReceived)
{
case 0:
Continue = FALSE;
break;
case SOCKET_ERROR:
Continue = FALSE;
break;
default:
pDataBufferIndex += LengthReceived;
totalReceived += LengthReceived;
length_counter+=LengthReceived;
break;
}
}
file.Write(DataBuffer,totalReceived);
}
closesocket(sockConn);
file.Close();
return 0;}
还有为什么大文件就不能读写了???
请高人指点。下次在好好给分。
{
DWORD dwIP = ((SENDPARAM*)lpParameter)->m_dwIP;
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(7000);
addrSrv.sin_addr.S_un.S_addr = dwIP; SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if(SOCKET_ERROR == connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
AfxMessageBox("Connect fail!");
return 0;
}
// connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
CString fileName;
fileName = myFile.GetFileName();
send(sockClient, fileName, fileName.GetLength()+1, 0);
char Recvstr[2];
memset(Recvstr, 0, 2);
recv(sockClient,Recvstr,2,0);
if(CString(Recvstr) == "N")
return 0; CString strLength;
UINT fileLength;
fileLength = myFile.GetLength();
strLength.Format("%d", fileLength);
send(sockClient, strLength, fileLength, 0);
// Sleep(1000);
Sleep(10);
// now send the file's data
char sendData[SEND_BUFFER_SIZE];
memset(sendData, 0, SEND_BUFFER_SIZE);
UINT LeftToSend = myFile.GetLength();
do
{
memset(sendData, 0, SEND_BUFFER_SIZE);
int sendThisTime, doneSoFar, buffOffset;
sendThisTime = myFile.Read(sendData, SEND_BUFFER_SIZE);
buffOffset = 0;
do
{
doneSoFar = send(sockClient, sendData + buffOffset, sendThisTime,0);
buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
LeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );
}
while(LeftToSend >0 );
/* UINT length_counter=0;
int sendLen;
while(length_counter<fileLength)
{
memset(sendData,0,SEND_BUFFER_SIZE);
sendLen = myFile.Read(sendData,SEND_BUFFER_SIZE);
send(sockClient,sendData,sendLen,0);
length_counter += sendLen ;
}*/
AfxMessageBox("Send Success!");
myFile.Close();
closesocket(sockClient);
return 1;
}DWORD WINAPI CTransferDlg::RecvConnProc(LPVOID lpParameter)
{
// if(bOpenFile == FALSE)
// return 0;
SOCKET sockSrv=((RECVPARAM *)lpParameter)->sock;
HWND hwnd=((RECVPARAM *)lpParameter)->hwnd;
SOCKADDR_IN addrClient;
SOCKET sockConn;
int len = sizeof(SOCKADDR);
// while(1)
// {
listen(sockSrv, 10);
sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
RECVPARAM *pRecvFileParam=new RECVPARAM;
pRecvFileParam ->sock = sockConn;
pRecvFileParam ->addr = addrClient;
HANDLE hReceFileThread = CreateThread(NULL, 0, RecvFileProc, (LPVOID)pRecvFileParam,
0, NULL);
CloseHandle(hReceFileThread);
// }
return 0;
}DWORD WINAPI CTransferDlg:: RecvFileProc(LPVOID lpParameter)//接收文件进程
{
// if(bOpenFile == FALSE)
// return 0;
SOCKET sockConn = ((RECVPARAM *)lpParameter)->sock;
SOCKADDR_IN addrClient = ((RECVPARAM *)lpParameter)->addr;
char filename[100];
memset(filename,0 ,100);
//reveive file's name
recv(sockConn,filename,100,0); CString RecvMsg;
RecvMsg.Format("%s send you -%s- Accept or Not?",inet_ntoa(addrClient.sin_addr),filename);
if(IDNO == ::AfxMessageBox(RecvMsg, MB_YESNO))
{
send(sockConn, "N", 2, 0);
return 0;
}
else
{
send(sockConn, "Y", 2, 0);
}
char strfileLen[32];
memset(strfileLen,0,32);
// Sleep(10);
recv(sockConn,strfileLen,32,0);
UINT filelen = atoi(strfileLen);
CFileDialog filedlg(false,NULL,filename);
if(IDCANCEL==filedlg.DoModal())
return 0;
CFile file;
file.Open(filedlg.GetFileName(),CFile::modeWrite|CFile::modeCreate|CFile::typeBinary);
// Sleep(5000);
char DataBuffer[SEND_BUFFER_SIZE];
memset(DataBuffer, 0, SEND_BUFFER_SIZE);
UINT length_counter = 0;
while(length_counter < filelen)
{
memset(DataBuffer, 0, SEND_BUFFER_SIZE);
int LengthReceived=0;
int totalReceived=0;
BOOL Continue = TRUE;
char* pDataBufferIndex = &DataBuffer[0];
while (Continue && (totalReceived < SEND_BUFFER_SIZE ))
{
LengthReceived =
recv(sockConn, pDataBufferIndex, (SEND_BUFFER_SIZE - totalReceived), 0);
switch(LengthReceived)
{
case 0:
Continue = FALSE;
break;
case SOCKET_ERROR:
Continue = FALSE;
break;
default:
pDataBufferIndex += LengthReceived;
totalReceived += LengthReceived;
length_counter+=LengthReceived;
break;
}
}
file.Write(DataBuffer,totalReceived);
}
closesocket(sockConn);
file.Close();
return 0;}
还有为什么大文件就不能读写了???
请高人指点。下次在好好给分。
解决方案 »
- 为什么socket 的accept()放到函数里的时候就不能阻塞了?
- 自定义类中如何使用对话框中的一些函数
- 90分求,Bluetooth通过TCP/IP,连自己这样能实现吗?
- c++学习问题
- 高分求矩形区域随机划分算法
- 网上提供的qq界面代码同一时刻只能有一个头像在跳动,要实现多个头像同时跳动怎么办?
- 怎样在多文档窗口中显示图片????
- listview在 IE中 图标显示不出来
- 请问《Visual C++技术内幕》第四版(清华大学出版社)这本书好还是第五版(出版社忘了)那本好呢?
- 关于CReBar
- [matlab]builder for COM 出现 The chosen compiler does not support building COM objects
- 公司不能上qq? 谁能解决? 使用代理也不行。
利用线程 完整的发/接例程 我有,需要的话,短消息与我
现在又出现新的问题,那就是在传的过程中有乱码加进去,就在文件前加了几行乱码,我好像都把内存清空了,也还是有这情况出现,而且传的文件有些打不开,像.wma不能播放,.doc,而.mp3可以播放,但是这些文件大小在传的过程中大小还是一致的,请问问题是不是出在加了乱码进去啊???