采用的是send 和recv函数
服务器端没有任何问题,只要你向服务器发送数据后就会收到数据,现在我是第一次发送的数据能够正确的接收,但是第二次发送数据后怎么都不能收到了,不停的进行select循环,各位碰到过这样的问题没有,头都大了,谢谢!!

解决方案 »

  1.   

    噢,琢磨了半天知道楼主是什么意思了呵呵我觉得问题应该是因为楼主处理完一个连接以后应该让套接字继续处理另一个连接楼主看看是不是在第一个客户端套接字推出以后服务器端CPU占用率就100%了?
      

  2.   

    同意PiggyXP(什么也不说) 的说法!
      

  3.   

    这是我的代码(测试):
    建一个win32console application
    把代码考进去调试吧,谢谢了解决了问题一定重分酬谢!!
    #include "winsock.h"
    #include "iostream.h"
    #pragma comment(lib, "ws2_32.lib")
    char * ErrorStr;
    char * Pop3Server="pop3.163.com";
    char * PassWord="123456";
    char * UserName="lbyang";
    SOCKET sock;
    bool Connect();
    bool Close();
    int RecData(char * outdata,int outdatalen);
    int SendData(char *cmd,int cmdlen);
    int SubString(char * str, char * sub, int start, int length);
    int JudgeString(char * strCheck);
    int Login();
    int main()
    {
    char c;
    Connect(); Close();
    cin>>c;
    return 0;
    }
    bool Connect()
    {
    // TODO: Add your implementation code here IPPROTO_TCP
    unsigned int iPort=110;
    struct sockaddr_in m_sockaddr;
    WSADATA wsd;
        WSAStartup(MAKEWORD(1,1),&wsd);
    sock=socket(AF_INET,SOCK_STREAM,0);
    if(sock==INVALID_SOCKET)
    {
    cout<<"Create_Socket_Error";
    return S_FALSE;
    }
    if(strlen(Pop3Server) == 0)
    {
    cout<<("initialize pop3server first");
    return S_FALSE;
    }
    hostent *hostEnt = NULL;
    long lIPAddress =0;
    hostEnt = gethostbyname(Pop3Server);//根据计算机名得到该计算机的相关内容;
    if(hostEnt!=NULL)
    {
    lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr;
    m_sockaddr.sin_addr.s_addr = lIPAddress;
    }
    else
    {
    m_sockaddr.sin_addr.s_addr = inet_addr(Pop3Server);
    }
    m_sockaddr.sin_family = AF_INET;
    m_sockaddr.sin_port = htons(iPort);
    unsigned long NonBlock;
    NonBlock = 1;
       
    if(connect(sock, (sockaddr *)&m_sockaddr, sizeof(m_sockaddr))==SOCKET_ERROR)
    {
    cout<<"Connect_Pop3Server_Error";
    return S_FALSE;
    }
    if (ioctlsocket(sock, FIONBIO, &NonBlock) == SOCKET_ERROR)
       {
          cout<<("ioctlsocket() failed with error %d\n", WSAGetLastError());
          return S_FALSE;
       }

    if(UserName==NULL||PassWord==NULL)
    {
    cout<<"UserName Or PassWord is empty,first initialize them";
    return S_FALSE;
    }
    char outdata[240];
    int outdatalen=240;
    /*
    char cmd1[10];
    ZeroMemory(cmd1,sizeof(cmd1));
    if(SendData(cmd1,sizeof(cmd1))==-1)
    return S_FALSE;
    */
    if(RecData(outdata,outdatalen)==-1)
    {
    cout<<("No welcome word");
    return S_FALSE;
    }
    cout<<"welcome:"<<outdata<<endl;
    if(Login()==0)
    {
    cout<<("OK");
    return S_OK;
    }
    else
    {
    cout<<("UserName or PassWord is wrong!,Can't login Pop3 server")<<endl;
    return S_FALSE;
    }
    }
    bool Close()
    {
    // TODO: Add your implementation code here
    if(closesocket(sock)== SOCKET_ERROR)
    {
    cout<<("closesocket() failed");
    return S_FALSE;
    }
    //WSAClean();
    cout<<("close sock OK");
    WSACleanup();
    return S_OK;
    }int SendData(char *cmd,int cmdlen)
    {
    int ret = 0;
    timeval tv01;// = {1,0};//1ms钟延迟,实际为0-10毫秒 
    tv01.tv_sec=2;
    tv01.tv_usec = 0; fd_set fdr;
    int nSelectRet=0; 
    cout<<"in senddata "<<endl;
    if( cmd == NULL)
    {
    cout<<("SendCmd_PARAM_Error");
    return -1;
    }
    strcat(cmd,"\r\n");
    cout<<cmd;
    tv01.tv_sec=2;
    tv01.tv_usec=0;
    int i=0;
    int len;
    while(1)
    {
    FD_ZERO(&fdr);
    FD_SET(sock,&fdr);
    Sleep(10);
    nSelectRet=select(0,0,&fdr,0,0);//&tv01
    if(SOCKET_ERROR==nSelectRet) 

    cout<<("可写状态为零");
    ::closesocket(sock); 
    return -1;
    }
    if(nSelectRet==0)//超时发生,无可写数据

    cout<<("超时发生,不可写数据");
    return -1;

    if(nSelectRet>0&&FD_ISSET(sock, &fdr))
    {
    len=send(sock,cmd, cmdlen,0);
    if(len==SOCKET_ERROR)
    {
    cout<<("SEND_COMMAND_DATA_ERROR");
    return -1;
    }
    else
    {
    cout<<("SEND_DATA_len")<<len<<endl;
    return 0;
    }
    }
    if(i++>100)
    {
    cout<<"send select "<<i<<endl;
    return -1;
    }

    }
    return 0;
    }int RecData(char * outdata,int outdatalen)
    {
    int ret = 0;
    timeval tv01;// = {1,0};//1ms钟延迟,实际为0-10毫秒 
    tv01.tv_sec=20;
    fd_set fdr;
    int nSelectRet=0; 
    FD_ZERO(&fdr);
    FD_SET(sock,&fdr);
    tv01.tv_sec=2;
    cout<<"in RecData "<<endl;
    int i=0;
    while(1)
    {
    //FD_SET(1, &fdr);
    FD_ZERO(&fdr);
    FD_SET(sock,&fdr);
    nSelectRet=::select(0, &fdr, NULL, NULL, &tv01);//检查可读状态 
    Sleep(100);
    if(SOCKET_ERROR==nSelectRet) 

    //itoa(WSAGetLastError(),ErrorStr,10); 
    cout<<("可读出错");
    // ::closesocket(sock); 
    return -1;
    }
    if(FD_ISSET(sock, &fdr))
    {
    ret=recv(sock, outdata, outdatalen, 0);
    if( ret == 0 )
    {
    cout<<("str_cli: server terminated prematurely")<<endl;
    return -1;
    }
    else if( ret == SOCKET_ERROR )
    {
    cout<<("Receive error!");
    // ErrorStr=_T
    return -1;
    }
    outdata[ret] = '\0';
    cout<<("Receive data")<<endl;
    return 0;
    }
    i++;
    //cout<<i++<<endl;
    if(i>50)
    {
    cout<<"select:"<<i<<endl;
    break;
    } }
    return -1;
    }
    int Login()
    {
    char temp1[240];
    char cmd1[40]="user ";
    char cmd2[40]="pass ";
    int ret=0;
    //return 0;
    cout<<"in Login "<<endl; strcat(cmd1,UserName);
    strcat(cmd2,PassWord);
    ZeroMemory(temp1,sizeof(temp1));
    if(SendData(cmd1,sizeof(cmd1))==-1)
    return -1;
    ZeroMemory(temp1,sizeof(temp1));
    if(RecData(temp1,sizeof(temp1))==-1)
    return -1;
    cout<<temp1<<endl;
    if(SendData(cmd2,sizeof(cmd2))==-1)
    return -1;
    ZeroMemory(temp1,sizeof(temp1));
    if(RecData(temp1,sizeof(temp1))==-1)
    return -1; cout<<temp1<<endl;
    // ZeroMemory(temp1,sizeof(temp1));
    // if(SendPopCmd(cmd2,sizeof(cmd2)+1,temp1,sizeof(temp1))==-1)
    // return -1;

    // TempData=temp1;
    if(JudgeString(temp1)==0)
    {
    // ZeroMemory(temp2,sizeof(temp2));
    return 0;
    }
    else
    {
    /// ZeroMemory(temp2,sizeof(temp2));
    cout<<("UserName or PassWord is wrong!Can't login Pop3 server")<<endl;
    return -1;
    }

    }int JudgeString(char * strCheck)
    { char t[10];
    SubString(strCheck,t,0,3);
    if(strcmp(t,"+OK"))
    {
    return -1;
    }
    else
    return 0;
    }int SubString(char * str, char * sub, int start, int length)
    {
    char *t;
    char *p;
    int i=0;
    int len=strlen(str);
    t=sub;
    if(start+1>len)
    {
    *t='\0';
     return -1;
    }
    p=str+start;
    if(start+length>len)
    {
    while(*p!='\0')
    { *t=*p;
    t++;
    p++;
    }
    }
    else
    while(i!=length)
    {
    *t=*p;
    t++;
    p++;
    i++;
    }
    *t='\0';
    return 0;
    }
      

  4.   

    好久没用过select模型了,看得我头都大了 T_T楼主出现的问题是同一个套接字的第二次发送就不行了呢还是第一个套接字退出了,第二个套接字再进行连接发送就不行了?
      

  5.   

    是同一个套接字的第二次发送就不行了!谢谢 PiggyXP(什么也不说) ,你找到是什么原因了吗?