一般server这样:
   CSocket sockSrvr;
sockSrvr.Create(2004);
sockSrvr.Listen();
CSocket sockRecv;
sockSrvr.Accept(sockRecv);
SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA             FindFileData;
//Dlg.GetPathName()
FindClose(FindFirstFile("aa.txt",&FindFileData));
    memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
    strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle());
    StreamFileInfo.dwFileAttributes     =FindFileData.dwFileAttributes;
    StreamFileInfo.ftCreationTime       =FindFileData.ftCreationTime;
    StreamFileInfo.ftLastAccessTime     =FindFileData.ftLastAccessTime;
    StreamFileInfo.ftLastWriteTime      =FindFileData.ftLastWriteTime;
    StreamFileInfo.nFileSizeHigh        =FindFileData.nFileSizeHigh;
    StreamFileInfo.nFileSizeLow         =FindFileData.nFileSizeLow;
sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
UINT dwRead=0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[1024];
UINT dw=myFile.Read(data, 1024);
sockRecv.Send(data, dw);
dwRead+=dw;
}
myFile.Close();
sockRecv.Close();
一般client这样:
        AfxSocketInit(NULL);
CSocket sockClient;
sockClient.Create();
CString szIP;
GetDlgItemText(IDC_EDIT_IPADDRESS,szIP);
if(!sockClient.Connect((LPCTSTR)szIP, 2004))
{
AfxMessageBox("连接到对方机器失败!");
return;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));
CFile destFile(StreamFileInfo.szFileTitle, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
UINT dwRead = 0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[1024];
memset(data,0,1024);
UINT dw=sockClient.Receive(data, 1024);
destFile.Write(data, dw);
dwRead+=dw;
}
SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
                &StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
destFile.Close();
SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
sockClient.Close();
AfxMessageBox("接收完毕!");
程序实现的是server端发送数据,client端接收数据!!!将sockRecv实现Receive而sockcleint实现Send 作对调更改后执行不对,为什么?我现在想实现:server端接收数据,而client端发送数据,怎么办?上面的代码如何修改?

解决方案 »

  1.   

    mattrew(为西)及各位高手:
    服务器和客户端处于死锁状态,服务器端用多线程实现发送和 接收同时进行应该怎样做呢?谢谢!
      

  2.   

    楼上说的对,分别在两个Run()函数中添加发送socket和接收socket
    然后AfxBeginThread()或CreateThread()
      

  3.   

    server端怎么做发送?sockRecv.send(...)不行,sockclient.Receive(...)可以吗?
    仅实现简单的client发送,server接收就可,上面的程序怎么样修改呢?谢谢!
      

  4.   

    接收信息:
    if(!AfxSocketInit())

    AfxMessageBox("WindowsSocket initial failed!"); 
    return 1; 

    CSocket ChatRecieve; 
    if(!ChatRecieve.Create())

    AfxMessageBox("ReceiveSocket create failed!"); 
    return 1; 

    else

         ChatRecieve.Connect(pL2Info->ipL2Address,pL2Info->iL2Port); 

    ChatRecieve.ReceiveFrom(&pL2Info->pCommData,8096,pL2Info->ipL2Address,pL2Info->iL2Port); 
    ChatRecieve.Close();