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

注意!

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



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