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;}
   
还有为什么大文件就不能读写了???
请高人指点。下次在好好给分。

解决方案 »

  1.   

    我是要实现两台电脑上传送文件,但为什么只能传.txt文件???其他的文件格式不行呢???
      

  2.   

    粗略看下,你这个myFile 怎么声明的? 指定CFile::typeBinary没?
    利用线程 完整的发/接例程 我有,需要的话,短消息与我
      

  3.   

    to:seu07201213我的 myFile 是个全局变量,因为有两个函数要用到它,你能否发到 ,谢谢了
    现在又出现新的问题,那就是在传的过程中有乱码加进去,就在文件前加了几行乱码,我好像都把内存清空了,也还是有这情况出现,而且传的文件有些打不开,像.wma不能播放,.doc,而.mp3可以播放,但是这些文件大小在传的过程中大小还是一致的,请问问题是不是出在加了乱码进去啊???