用MFC的CSocket做了一个HTTP的连接,第一次连接,一连就通,第二次连接,发出连接报文以后,没有响应,系统自动重发第二次,才能收到回应报文。

解决方案 »

  1.   

    void CDoxmlDlg::OnButton1() 
    {
    sock.Create(5555,SOCK_STREAM);
    sock.Connect("192.168.1.1",80);
    }void CDoxmlDlg::OnMySocketReceive()
    {
    char strRecv[500]="";
    sock.Receive(strRecv, sizeof(strRecv));
             MessageBox(strRecv);
    sock.Close();
    }
    void CDoxmlDlg::OnButton2() 
    {
    char buf[]="/*信息约*/";
    sock.Send(buf,sizeof(buf));

    }
      

  2.   

    就这个样子,这个是于一个设备的通讯,80端口,HTTP协议
      

  3.   

    不奇怪,http连接是基于TCP的。你发送http请求也就是get请求过去,需要等待web服务器返回,如果web服务器刚好处于忙碌状态,你的进程将会处于等待状态,你可以检查http的状态码,如果返回http 200 ok表示连接成功。你可以用wininet来处理http请求,不必要用CSocket
      

  4.   

    用socket实现的http get and post method:
    http://community.csdn.net/Expert/topic/3532/3532744.xml?temp=.5008356
      

  5.   

    发送的报文:
    POST /UPnP/control/WANIPConnection HTTP/1.1
    HOST: http://192.168.1.1:80
    CONTENT-LENGTH: 259
    CONTENT-TYPE: text/xml; charset="utf-8"
    SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>收到的报文:
    HTTP/1.1 200 OK
    CONTENT-LENGTH:357
    CONTENT-TYPE:text/xml;charset="utf-8"
    EXT:
    SERVER:System/1.0 UPnP/1.0 IGD/1.0<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
     <s:Body>
      <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
       <NewExternalIPAddress>192.168.150.5</NewExternalIPAddress>
      </u:GetExternalIPAddressResponse>
     </s:Body>
    </s:Envelope>
      

  6.   

    我不是说不通,而是能发送和收到正确的报文,但是两次连接之间,也就是第二次请求连接(TCP三次握手的第一次)报文发出以后,对方没有回应,系统在等待2-3秒以后自动重发,才能收到对方的回应请求(TCP握手第二、三次)
      

  7.   

    您看我的代码,点BUTTON1以后,再点BUTTON2,现在收到了回应,在OnMySocketReceive里面是把SOCKET断了的(因为HTTP协议栈的要求),然后再点BUTTON1,发出请求连接的报文,这个时候,应该马上就能够收到回应的报文(我是实验环境,所以不要考虑网络质量),可是等了2-3秒以后,还没有收到回应报文,这个时候协议栈自动帮我重新发请求报文,这次就OK了。
    希望大哥帮我解释一下为什么
      

  8.   

    你的代码我没有看到构造http报文的片段,是否省略了?TCP三次握手的第一次是执行connect等待服务器accept的过程,你检查一下这段代码。或者把我贴的类拷贝过去用。
      

  9.   

    用wininet函数比如SendRequest函数可以直接构造http post方法,我觉得你构造http头的时候可能哪里写错了。
      

  10.   

    我的HTTP报文有啊,就是这个:
    发送的报文:
    POST /UPnP/control/WANIPConnection HTTP/1.1
    HOST: http://192.168.1.1:80
    CONTENT-LENGTH: 259
    CONTENT-TYPE: text/xml; charset="utf-8"
    SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body></s:Envelope>我是跟设备里的CGI通信
      

  11.   

    扯远了,我感觉我的东西和HTTP关系并不是很大吧?我的问题出现在请求连接的时候,而不是发HTTP报文的时候另:我的HTTP报文没错,否者怎么可能收到正确的回应呢?
      

  12.   

    你是不是执行了两次connect了啊?通讯完之后未关闭socket,如果服务器端性能没有问题的话
      

  13.   

    同事用SOCKET就没问题,我用MFC的CSocket就有问题,郁闷
      

  14.   

    第一次连接,一连就通,第二次连接,发出连接报文以后,没有响应
    这段话的意思是说你连接了两次吧。没有响应我估计是前一个socket端口还未退出的缘故
      

  15.   

    你用我贴给你的request类来处理就不会有这样的问题了。
    http://community.csdn.net/Expert/topic/3532/3532744.xml?temp=.5008356
      

  16.   

    三次握手是在connect到accept之间完成的
      

  17.   

    很郁闷,我改用SOCKET(winsock32.h,不是CSocket类)解决了,TNND,不知道为什么
      

  18.   

    很郁闷,我改用SOCKET(winsock32.h,不是CSocket类)解决了,TNND,不知道为什么
      

  19.   

    我给你建议的就是socket api和wininet,避免出错
      

  20.   

    CSocket真是不怎么样,经常听到朋友提起出些莫名其妙的错误,换成socket 的api自己来写就好了幸好我从来不用^_^
      

  21.   

    哎,找不到答案,看来高手真的很少,算了,结了吧
    顺便说说什么是三次握手,有同学说的是connect到accept,这个是很片面也是很肤浅的
    三次握手是指:将要连接中的一方,发送一个带有SYN标志位的数据报到另一端,另一端收到这个报文以后,回应一个SYN ACK数据报(就是带有ACK标志的回应报文),第一端在收到这个SYN ACK以后,再回应一个ACK
    SYN:请求连接
    ACK:序号有效(通常用来表示收到)
    哎~~~~~~~
      

  22.   

    CSDN:中国程序员网站
    中国真的没有优秀的程序员吗?
    哎~~~~~~~~~~~