如题!

解决方案 »

  1.   

    服务器端代码:
    #include <winsock2.h>
    #include <stdio.h>
    #include <windows.h>
    HANDLE hume;
    CFile myFile;
    UINT    nActual = 0;
    SOCKADDR_IN ser2;
    SOCKET ser1;
    int len;
    SOCKADDR_IN ser4;
    void RevFile(const SOCKET& s)
    {
    char buffer[1024];
    char temp[1024];
    int rcv = recv(s,buffer, 1024, 0);
    for (int i=0; buffer[i]!='*'; i++)
    {
    temp[i] = buffer[i];
    }
    temp[i++] = '\0';
    CString strFileName = temp;
    strcpy(temp, buffer + i);
    long lFileSize = atol(temp);
    CString m_strFilePath="d:\\tutu.bmp";//+strFileName; CFile file(m_strFilePath, CFile::modeCreate | CFile::modeWrite);
    long iTemp = 0;
    while (1)
    {
    rcv = recv(s, buffer, 1024, 0);
    if (rcv == 0)
    {
    break;
    }
    file.Write(buffer, rcv);
    iTemp += rcv;
    }
    file.Close();
    if (iTemp != lFileSize)
    {
    }
    closesocket(s);

    }
    void wordthd(const SOCKET& s,char buffer[1024])
    {
              if (myFile.Open(("c:\\infa.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite, NULL))
    {
    myFile.SeekToEnd();
    myFile.Write(buffer,strlen(buffer));
    myFile.Close();
    }
    closesocket(s);
    }
    DWORD WINAPI picturethd(LPVOID lpParameter
      )
    {
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD( 1, 1 );
    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) 
    {
    //return 1;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
    HIBYTE( wsaData.wVersion ) != 1 ) 
    {
    WSACleanup( );
    }
    SOCKET ser1=socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN ser2;
    ser2.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    ser2.sin_family=AF_INET;
    ser2.sin_port=htons(5999);
    bind(ser1,(SOCKADDR*)&ser2,sizeof(SOCKADDR));
    listen(ser1,10);
    int len=sizeof(SOCKADDR);
    SOCKADDR_IN ser4;
    while(1)
    {
    SOCKET s=accept(ser1,(SOCKADDR*)&ser4,&len);
    char buffer[1024];
    char temp[1024];
    int rcv = recv(s,buffer,strlen(buffer),0);
    ::AfxMessageBox(buffer);//就是这里老是只出现一个P!!!!!!!!!!!!!!!!!!!!!!!然后后面的就乱了。
    if(strcmp(buffer,"pict")==0)
    RevFile(s);
    else
            wordthd(s,buffer);
    }
    //ReleaseMutex(hume);
    }
    void CMotherinsectDlg::OnButton1()
    {
    HANDLE nimei=CreateThread(NULL,0,picturethd,NULL,0,NULL);
    CloseHandle(nimei);
    //CreateThread(NULL,0,wordthd,NULL,0,NULL);
    //hume=CreateMutex(NULL,FALSE,NULL);//匿名的互斥变量
    MSG   stMsg   =   {0};
    while(1)
    {
    ::GetMessage   (&stMsg,(HWND)NULL,0,0);
    ::TranslateMessage   (&stMsg);
    ::DispatchMessage   (&stMsg);
    }
    }
      

  2.   

    int rcv = recv(s,buffer,strlen(buffer),0); 
    ::AfxMessageBox(buffer);//就是这里老是只出现一个P!!!!!!!!!!!!!!!!!!!!!!!然后后面的就乱了。 
    ---------
    出一个就不错了...其他地方都还没有看....先吧这里改成
    int rcv = recv(s,buffer,sizeof(buffer),0); 
      

  3.   

    这样改:
    int length = recv(s,buffer,1024,0);
    buffer[length]='\0';
    ::AfxMessageBox(buffer);//这样就不会乱了
      

  4.   

    我觉得你::AfxMessageBox(buffer);用法有些奇怪
    你for(int i=0;i<1024; i++)
    {
    TRACE("%02x ",buffer[i]);
    }
    看看,也有可能和是有符号型有关系
      

  5.   

    strlen以'\0'作为结束符,你使用前应该将数组初始化,否则不确定你得到的是什么值memset(buffer, 0, sizeof(buffer));
    int rcv = recv(s,buffer,strlen(buffer),0); 
      

  6.   

    strlen貌似返回第一个'\0'的位置
      

  7.   

    谢谢各位的 帮助现在pict已经可以正确接受 可是我不知道为什么 请大侠赐教!
      

  8.   

    sizeof(buffer) = 1024  // buffer的长度
    strlen(buffer) 是 buffer的字符串长度,  你那种情况应该是编译器把buffer初始化成'\0', strlen(buffer) = 0recv 的 第三个参数需要的是buffer的长度
    ------------
    严格写,其实应该这样char buffer[1024] = {0};  // 将 buffer 的没个字符初始化为 '\0' ; 否则buffer的初始值根据编译器的不同可能不同
    int rcv = recv(s,buffer,sizeof(buffer),0); 搞顶了就给分哈~