void safe_close(int &sock);
int main(int argc, char *argv[]) {
int sockfd = 0, n = 0;
socklen_t len = 0;
char host[512] = {0};
char buf[1024] = {0};
struct hostent *server;
struct sockaddr_in serv_addr, loc_addr;
if
(argc < 2) {
printf
(
"Please input host name\n"
);
exit
(-1);
}
strncpy(host, argv[1], sizeof(host));
server = gethostbyname(host);
//
判断输入的域名是否正确
if
(NULL == server) {
printf
(
"find host: %s failed.\n"
, host);
exit
(-1);
}
if
(-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) {
//
创建socket
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),
"new socket failed. errno: %d, error: %s"
, errno, strerror(errno));
perror(buf);
exit
(-1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
//
http标准端口号
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
if
(-1 == inet_pton(AF_INET, host, &serv_addr.sin_addr)) {
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),
"inet_pton failed. errno: %d, error: %s"
, errno, strerror(errno));
perror(buf);
exit
(-1);
}
if
(-1 == connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) {
//
连接socket
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),
"connect socket failed. errno: %d, error: %s"
, errno, strerror(errno));
perror(buf);
exit
(-1);
}
printf
(
"connect to %s success.\n"
, host);
len = sizeof(sizeof(loc_addr));
memset(&loc_addr, 0, len);
if
(-1 == getsockname(sockfd, (struct sockaddr *)&loc_addr, &len)) {
//
获取socket绑定的本地address信息
memset(buf, 0, sizeof(buf));
snprintf(buf, sizeof(buf),
"get socket name failed. errno: %d, error: %s"
, errno, strerror(errno));
perror(buf);
safe_close(sockfd);
exit
(-1);
}
if
(loc_addr.sin_family == AF_INET) {
//
打印信息
printf
(
"local port: %u\n"
, ntohs(loc_addr.sin_port));
}
safe_close(sockfd);
return
0;
}
void safe_close(int &sock) {
if
(-1 != sock) {
shutdown
(sock, SHUT_RDWR);
sock = -1;
}
}