无论点击发送,还是接收都死掉了,为什么阿void CTrysocketDlg::OnRecvbn() 
{
// TODO: Add your control notification handler code here
CFile myFile;
struct sockaddr_in server;
char dir[]="D:\\worker.txt";
char IPAddr[]="192.168.0.77";
UINT  u_port=30001;
SOCKET serSocket;

SOCKET  client ;
  sockaddr_in    fromClient;
char buff[512];
WSADATA  wsd;
int wret=WSAStartup(0x101,&wsd);
if(wret)return;
   serSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if(serSocket==INVALID_SOCKET)return;
   server.sin_family=AF_INET;
   server.sin_port=htons(u_port);
   server.sin_addr.s_addr=inet_addr(IPAddr);   fromClient.sin_family=AF_INET;
   fromClient.sin_port=htons(u_port);
   fromClient.sin_addr.s_addr=inet_addr(IPAddr);
   if(bind(serSocket,(sockaddr*)&server,sizeof(server))!=0)return;
   if(listen(serSocket,10)!=0)return;
   int slen=sizeof(fromClient);
   client=accept(serSocket,
            (struct sockaddr*)&fromClient,&slen);
   if(client==INVALID_SOCKET)return;
   myFile.Open(dir,CFile::modeCreate|CFile::modeWrite);
   int y;
   while (y=recv(client,buff,512,0))
   {
   myFile.Write(buff,y);
   }
   myFile.Close();
   closesocket(serSocket);
   closesocket(client);
   WSACleanup();}void CTrysocketDlg::OnSendbn() 
{
// TODO: Add your control notification handler code here
CFile sendingFile;
struct sockaddr_in sendsocket;
char dir[]="E:\\workingsocket.txt";
char IPAddr[]="192.168.0.77";
UINT  u_port=30001;
SOCKET sendingSocket;
char buff[512];
WSADATA  wsd;
    int wsaret=WSAStartup(0x101,&wsd);
    if(wsaret)return;
sendsocket.sin_family=AF_INET;
sendsocket.sin_port=htons(u_port);
sendsocket.sin_addr.s_addr=inet_addr(IPAddr);
   sendingSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sendingSocket==INVALID_SOCKET)  return;
if(connect(sendingSocket,(struct sockaddr*)&sendsocket,sizeof(sendsocket)))
{
closesocket(sendingSocket);
              return;
}
sendingFile.Open(dir,CFile::modeRead);
int y;
while(y=sendingFile.Read(buff,512))
{
send(sendingSocket,buff,y,0);
}
closesocket(sendingSocket);
WSACleanup();

}

解决方案 »

  1.   

    服务器和客户极端都定义一下结构:
    typedef struct _SOCKET_STREAM_FILE_INFO {    TCHAR       szFileTitle[128];                   //文件的标题名
        DWORD       dwFileAttributes;                   //文件的属性
        FILETIME    ftCreationTime;                     //文件的创建时间
        FILETIME    ftLastAccessTime;                   //文件的最后访问时间
        FILETIME    ftLastWriteTime;                    //文件的最后修改时间
        DWORD       nFileSizeHigh;                      //文件大小的高位双字
        DWORD       nFileSizeLow;                       //文件大小的低位双字
        DWORD       dwReserved0;                        //保留,为0
        DWORD       dwReserved1;                        //保留,为0} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;    服务器端:
    void CServerDlg::OnButtonLicsen() {
    // TODO: Add your control notification handler code here
    CFileDialog Dlg(TRUE);
    if(Dlg.DoModal()!=IDOK)
    return;

    CFile myFile;
    if(!myFile.Open(Dlg.GetPathName(), CFile::modeRead | CFile::typeBinary))
    {
    AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
    return;
    }

    CSocket sockSrvr;
    sockSrvr.Create(800); sockSrvr.Listen();
    CSocket sockRecv;
    sockSrvr.Accept(sockRecv); SOCKET_STREAM_FILE_INFO StreamFileInfo;
    WIN32_FIND_DATA             FindFileData; FindClose(FindFirstFile(Dlg.GetPathName(),&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();
    AfxMessageBox("发送完毕!");
    }////////////////////////////////////////////////////
    //客户机端:
    void CClientDlg::OnButtonSend() 
    {
    // TODO: Add your control notification handler code here
    AfxSocketInit(NULL);
    CSocket sockClient;
    sockClient.Create(); CString szIP;      //服务器IP地址
    GetDlgItemText(IDC_EDIT_IPADDRESS,szIP);    //通过对话框获取服务器IP地址

    if(!sockClient.Connect((LPCTSTR)szIP, 800))
    {
    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("接收完毕!");
    }
      

  2.   

    你的两个函数中都有while语句,而while中的条件判断返回可能永远都是非0值,造成死循环。
    比如:
      while (y=recv(client,buff,512,0)),而recv返回值有可能是已经接收的字符串的数目,也有可能返回的是错误代码。你应该用GetLastError看一看是不是你的网络初始化失败,或者是其它什么原因,错误代码都是非0值,具体意义在MSDN文档中可以查询。