|
我想在Linux下通过socket发送http请求,能连接上服务器,但没有回应,我通过gdb单步执行发现:在同过connect()方法返回的文件描述符fd向服务器端发送请求时(我用的是send()方法,用write()也不行)就没有响应了,请哪位仁兄多多指点。
主要代码如下:(原本不在一个同一个文件中,我把主要代码都摘了出来)
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <strings.h>
#define oops(msg) {perror(msg);exit(1);}
#define HOSTLEN 256
#define DEFAULT_PROTOCAL 0
#define LEN 1024
int ConnectToServer(char * host, int portnum); //连接指定服务器
main()
{
int fd;
char buf[LEN];
int n;
char* hostname = "dict.cn"; //服务器域名
char* referer = "http://cn.dict.cn/tools.html";
char* search = "/ws.php?q=word";
char* request = (char*)malloc(LEN * sizeof(char));
fd = ConnectToServer(hostname, 80);
if(fd == -1)
oops("Connect");
if(sprintf(request, "GET %s HTTP/1.0\r\nAccept:*/*\r\nReferer:% s\r\n""Host: %s\r\n\r\n",search, referer, hostname) <= 0)
oops("Request");
printf("connect to the server %d.\n",fd);
if(send(fd, request, sizeof(request),0) == -1)
oops("Send");
printf("Waiting...");
while((n = read(fd, buf, LEN)) > 0)
if(write(1, buf , n) != n)
oops("Write Result");
}
int ConnectToServer(char * host, int portnum)
{//连接指定服务器
int sock_fd;
struct sockaddr_in servaddr; /*the number to call*/
struct hostent *hp;
sock_fd = socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCAL);
if(sock_fd == -1)
return -1;
bzero((void *)&servaddr, sizeof(servaddr));
hp = gethostbyname(host);
if(hp == NULL)
return -1;
bcopy((void *)hp->h_addr, (void *)&servaddr.sin_addr, hp->h_length);
servaddr.sin_port = htons(portnum);
servaddr.sin_family = AF_INET;
if(connect(sock_fd, (struct sockaddr *)&servaddr, sizeof (servaddr)) != 0)
return -1;
return sock_fd;
} |
|