日期:2014-05-16 浏览次数:20919 次
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
#include <sys/socket.h>
#include <string.h>
#define MAXADDRLEN 256
#define BUFLEN 500
void print_resp(int sockfd)
{
printf("ready to print response\n");
char buf[BUFLEN];
int n;
int i;
for(i = 0; i < 5; i ++){
n = recv(sockfd, buf, BUFLEN, 0);
write(STDOUT_FILENO, buf, n);
}
}
int main(int argc, char *argv[])
{
struct addrinfo *ailist, *aip; //ai是addrinfo的缩写
struct addrinfo hint; //从服务端拿到的addrinfo可能很多,需要使用hint来过滤。hint对象本身也定义为addrinfo类型
int sockfd, err;
hint.ai_flags = 0;
hint.ai_family = 0;
hint.ai_socktype = SOCK_STREAM;
hint.ai_protocol = 0;
hint.ai_addrlen = 0;
hint.ai_canonname = NULL;
hint.ai_addr = NULL;
hint.ai_next = NULL;
if ((err = getaddrinfo("newsmth.org", "23", &hint, &ailist)) != 0) { //生成addrinfo
printf("getaddrinfo error: %s\n", gai_strerror(err));
exit(-1);
}
printf("getaddrinfo success\n");
for (aip = ailist; aip != NULL; aip = aip->ai_next) {
if ((sockfd = socket(aip->ai_family, SOCK_STREAM, 0)) < 0) //生成socket对象
err = errno;
printf("make socket success\n");
if (connect(sockfd, aip->ai_addr, aip ->ai_addrlen) < 0) { //连接
err = errno;
} else {
printf("socket connect success\n");
print_resp(sockfd);
exit(0);
}
}
fprintf(stderr, "can't connect to the target: %s\n",
strerror(err));
exit(1);
}