免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2565 | 回复: 3
打印 上一主题 下一主题

c++发送socket请求 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 11:38 |只看该作者 |倒序浏览
哪位高手帮我解决一下问题,谢谢了。
用c++发送http请求,第一次post数据获得session,用这个socket来发送get请求需要session的页面,但第二次的get请求始终没有结果,代码如下:

        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
        content.erase();
        wVersionRequested = MAKEWORD( 1, 1 );

        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {
                return 1;
        }       


        if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
        {
                WSACleanup( );
                return 2;
        }
       
        this->SocketClient=socket(AF_INET,SOCK_STREAM,0);
       
        sockaddr_in clientService;
        clientService.sin_addr.S_un.S_addr=inet_addr( this->ipaddr.c_str() );
        clientService.sin_family=AF_INET;
        clientService.sin_port=htons(this->port);
       

        if ( connect(this->SocketClient, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
        {
                WSACleanup();
                return 3;
        }
        char c_length[200];
        char RecvBuffer[6000];
        string bodyBuffer = "action=login&username=netmwd&userpwd=netmwd";
        size_t length = bodyBuffer.size();
        sprintf(c_length, "%d", length);
        string s_length=c_length;
        string headerBuffer = "POST /" + this->request_url + " HTTP/1.1\r\n";
                        headerBuffer += "keep-alive: 300\r\n";
                        headerBuffer += "Connection: Keep-Alive\r\n";
                        headerBuffer += "Host:" + this->domain +"\r\n";
                        headerBuffer += "Content-Type: application/x-www-form-urlencoded\r\n";
                        headerBuffer += "Content-Length: " + s_length + "\r\n\r\n";
                       
        send(this->SocketClient, (headerBuffer + bodyBuffer).c_str(), strlen((headerBuffer + bodyBuffer).c_str()), 0);

        while(1)
        {       
                int result = recv(this->SocketClient, RecvBuffer, 5300, 0);
                if ( result <= 0 )
                        break;
                RecvBuffer[result] = '\0';
                content.append(RecvBuffer);
        }

        string sendBuffer="GET /" + this->request_url + " HTTP/1.1\r\n";
                        sendBuffer += "Host:" + this->domain +"\r\n";
                        sendBuffer += "Connection: close\r\n\r\n";

        send(this->SocketClient, sendBuffer.c_str(), strlen(sendBuffer.c_str()), 0);

        char RecvBuffer2[6000];
        while(1)
        {
                int result = recv(this->SocketClient, RecvBuffer2, 5300, 0);
                cout << GetLastError() << endl;
                if ( result <= 0 )
                        break;
                RecvBuffer2[result] = '\0';
                content.append(RecvBuffer2);
        }

        closesocket(this->SocketClient);
        WSACleanup();

        return 0;

论坛徽章:
0
2 [报告]
发表于 2008-04-22 13:11 |只看该作者
顶一下,希望大家给我解答,谢谢

论坛徽章:
0
3 [报告]
发表于 2008-04-22 13:29 |只看该作者
session是取不到的
第一次取cookie,第二次把取得的cookie带上即可。

论坛徽章:
0
4 [报告]
发表于 2008-04-22 15:34 |只看该作者

回复 #3 Sorehead 的帖子

出来了,多谢, 贴出来与大家共享 www.mawudi.cn
WORD wVersionRequested;
        WSADATA wsaData;
        int err;
        content.erase();
        wVersionRequested = MAKEWORD( 1, 1 );

        err = WSAStartup( wVersionRequested, &wsaData );
        if ( err != 0 ) {
                return 1;
        }       


        if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
        {
                WSACleanup( );
                return 2;
        }
       
        this->SocketClient=socket(AF_INET,SOCK_STREAM,0);
       
        sockaddr_in clientService;
        clientService.sin_addr.S_un.S_addr=inet_addr( this->ipaddr.c_str() );
        clientService.sin_family=AF_INET;
        clientService.sin_port=htons(this->port);
       

        if ( connect(this->SocketClient, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
        {
                WSACleanup();
                return 3;
        }
        char c_length[200];
        char RecvBuffer[6000];
        string bodyBuffer = "action=login&username=netmwd&userpwd=netmwd";
        size_t length = bodyBuffer.size();
        sprintf(c_length, "%d", length);
        string s_length=c_length;
        string headerBuffer = "POST /" + this->request_url + " HTTP/1.1\r\n";
                        headerBuffer += "keep-alive: 300\r\n";
                        headerBuffer += "Connection: Keep-Alive\r\n";
                        headerBuffer += "Host:" + this->domain +"\r\n";
                        headerBuffer += "Content-Type: application/x-www-form-urlencoded\r\n";
                        headerBuffer += "Content-Length: " + s_length + "\r\n\r\n";
        send(this->SocketClient, (headerBuffer + bodyBuffer).c_str(), strlen((headerBuffer + bodyBuffer).c_str()), 0);
       
        while(1)
        {       
                int result = recv(this->SocketClient, RecvBuffer, 1024, 0);
                if ( result <= 0 )
                        break;
                RecvBuffer[result] = '\0';
                content.append(RecvBuffer);
        }

        closesocket(this->SocketClient);
       
        this->SocketClient=socket(AF_INET,SOCK_STREAM,0);
        if ( connect(this->SocketClient, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
        {
                WSACleanup();
                return 3;
        }
        int pos = content.find("PHPSESSID=");
        int pos2 = content.find(";",pos);
        string phpsessid = content.substr(pos+strlen("PHPSESSID="), pos2-pos-strlen("PHPSESSID="));
        string sendBuffer="GET /get_post.php HTTP/1.1\r\n";
                        sendBuffer += "Host:" + this->domain +"\r\n";
                        sendBuffer += "Cookie: PHPSESSID=" + phpsessid + "\r\n";
                        sendBuffer += "Connection: close\r\n\r\n";
        send(this->SocketClient, sendBuffer.c_str(), strlen(sendBuffer.c_str()), 0);
        char RecvBuffer2[6000];
        while(1)
        {
                int result = recv(this->SocketClient, RecvBuffer2, 5300, 0);
                cout << GetLastError() << endl;
                if ( result <= 0 )
                        break;
                RecvBuffer2[result] = '\0';
                content.append(RecvBuffer2);
        }

        closesocket(this->SocketClient);
        WSACleanup();
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP