C语言 socket编程发送http报文,却收不到服务器回复的问题


我使用c语言socket编程,写了一个小程序。就是向百度或者hao123服务器发送一个http请求。然后收到服务器的回复并且打印出来。但是我一共遇到了两个问题,弄了好久也不知道哪里出了问题。
1.我使用getservbyname("http","tcp")函数时为什么返回的结果不是80,而是5376。由于得到的结果不是80,这个函数也就没有用了,我只好又再connect前再一次写死端口为80。
2.就是我能够成功连接并且发送了报文,为什么却收不到服务器的回复?
下面是代码和运行截图

#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")


void initializtion(){
    WSADATA w;
WSAStartup(MAKEWORD(2,2),&w);
}
SOCKET connectSock(const char *hostname,const char *service,const char *transport){
    HOSTENT *phe; //host information entry
    SERVENT *pse; //service information entry
    PROTOENT getservbyname("http","tcp")*ppe;  //protocol information entry

    SOCKET sock;
    SOCKADDR_IN sockaddr_in;
    int type; //service type udp and tcp
    sockaddr_in.sin_family=AF_INET;
    memcmp(&sockaddr_in,0,sizeof(sockaddr_in));

    //通过服务名称获得端口号....类似http对应80端口   。。。但这里和我想象的一样
   if(pse=getservbyname("http","tcp")){
        sockaddr_in.sin_port=pse->s_port;
        printf("端口:%u\n",pse->s_port);
    }
    else if((sockaddr_in.sin_port=htons((u_short)atoi(service)))==0){
        printf("can not get port!\n");
        exit(1);
    }

    if(phe=gethostbyname(hostname)){
        memcpy(&sockaddr_in.sin_addr,phe->h_addr,phe->h_length);
        printf("IP:%s\n",inet_ntoa(sockaddr_in.sin_addr));
    }
    else if((sockaddr_in.sin_addr.s_addr=inet_addr(hostname))==INADDR_NONE){
        printf("can not get hostaddr!\n");
        exit(1);
    }


    if((ppe=getprotobyname(transport))==0){
        exit(1);
    }

    if(strcmp(transport,"udp")==0)
        type=SOCK_DGRAM;
    else{
        type=SOCK_STREAM;
    }

    if((sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
    {
        exit(1);
    }

    sockaddr_in.sin_port = htons(80);
    int a=connect(sock,(SOCKADDR*)&sockaddr_in,sizeof(SOCKADDR));
    printf("%d\n",a);


    return sock;

}

int main()
{
    initializtion();
    SOCKET s;
    char *request=
    "GET / HTTP/1.1\r\n"
    "Host: %s\r\n"
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
    "Accept-Encoding: gzip, deflate, sdch, br\r\n"
    "Accept-Language: zh-CN,zh; q=0.8\r\n"
    "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\r\n";

    char *hostname="www.hao123.com";
    char sendString[2048];

    s=connectSock(hostname,"HTTP","TCP");

    int ret=sprintf(sendString,request,hostname);

    char buffer[1024] = {0};  //文件缓冲区
    int nCount;

    if(send(s,sendString,ret,0)!=ret){
        printf("send error!\n");
        exit(1);
    }

    if((nCount=recv(s,buffer,1024,0)) < 0)
printf("recv error!\n");

printf("recv:%d\n%s\n",nCount,buffer);

    closesocket(s);
    WSACleanup();
    system("pause");
    return 0;

}

2 个解决方案

#1


发送的请求末尾再加个\n

#2


建议先学会使用抓包软件比如wireshark
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告