WSAStartup(winsock_version,&wsadata))
lphostent=gethostbyname(host_name);  
hsocket  =  socket(AF_INET,  SOCK_STREAM,  IPPROTO_TCP);  
saServer.sin_family  =  AF_INET;  
saServer.sin_port  =  htons(80);  
saServer.sin_addr  =  *((LPIN_ADDR)*lphostent->h_addr_list);  
nRet  =  connect(hsocket,  (LPSOCKADDR)&saServer,  sizeof(SOCKADDR_IN));  
char *lll="GET /XXX.php?getimg HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0\r\n\r\n";
nRet = send(hsocket,lll,strlen(lll),0);
执行recv操作;
//这里成功;
nRet = send(hsocket,lll,strlen(lll),0);
执行recv操作;问题:这里nRet会等于0
请问是怎么回事?怎样才能在同一个连接上多次SEND和RECV?

解决方案 »

  1.   

    nRet = send(hsocket,lll,strlen(lll),0);
    执行recv操作;
    //这里成功;
    nRet = send(hsocket,lll,strlen(lll),0);
    执行recv操作;
    这里执行了两次发送啊,不是接收和发送,理论上也是可以的.你要看看你的服务器端是怎么做的.能不能连接收信息
      

  2.   

    干嘛要2次 nRet = send(hsocket,lll,strlen(lll),0);??
    还有 同一个连接上多次SEND和RECV?你是传输什么?如果文件的话,可以用多点传输。。
    同一个连接上多次SEND和RECV 可以用多线程去解决
      

  3.   

    没发送成功?SEND的返回值就表示发送了多少数据的。同步TCP SOCKET也不能保证SEND能被成功完整执行,所以要有个返回值供判断。
      

  4.   


    同一连接上多次recv和send不是很正常嘛?
      

  5.   

    Socket通讯 操作模式有阻塞和非阻塞之分。建议用非阻塞方式并在线程中进行操作。
      

  6.   

    同一个SOCKET连接,多次收发包很正常
    你可以看下第2次发送后的异常, 按理说是没问题的,你换个HTTP地址请求试下 
      

  7.   

    HTTP 协议默认是无状态的(请求->响应->关闭)
    1.1版本开始支持保持连接(Keep-Alive),你必须在请求头中包含(Connection: Keep-Alive)保持连接不是强制性的,无论是服务器还是客户端都有权Close,因此如果要保持连接,你就必须对于套接字的事件(FD_CLOSE)进行处理你的问题是:
    1、没有保持连接的指示;服务器一定不会保持连接,一个请求响应完成,无条件关闭
    2、没有处理套接字的事件FD_CLOSE,你不知道服务器方已经关闭套接字,所以发送自然无法成功