TCP程序的一点疑惑

HW_Coder0501 2016-09-28 05:32:45
/* tcp_client.c */

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define portnumber 3333

int main(int argc, char *argv[])
{ ..............................
struct sockaddr_in server_addr; //用于记录网络地址
struct hostent *host;

if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}

bzero(&server_addr,sizeof(server_addr)); // 初始化,置0
server_addr.sin_family=AF_INET; // IPV4
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址
.
.
.
}

以上是利用TCP 在服务器与客户端进行信息传输的一段程序,是客户端的程序,这段程序中有两点我不是很明白:
1、gethostbyname(argv[1]))应该是获取的主机的IP地址,但它的返回值是指向结构体 hostent 的指针。那么这个主机的IP地址存到了哪里?怎么存的?

2、server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址
这一句是将host指针所指向的结构中的地址赋给server_addr.sin_addr,但=之后应该客户端(client)的地址,=之前应该是服务器地址,为什么要让服务器地址等于客户端地址?

不知道我的理解有没有错误的地方,有的话请指出。。请诸位大神各抒己见,在线等诸位回答。。
...全文
233 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
-小工匠- 2016-09-29
  • 打赏
  • 举报
回复
1.和你遇到同样的问题,我觉的应该是在函数内部malloc一块内存,然后返回指针。 2.server_addr结构体配置你需要链接的服务器的ip,port
hijack00 2016-09-29
  • 打赏
  • 举报
回复
引用 楼主 hhhlizhao 的回复:
/* tcp_client.c */ #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333 int main(int argc, char *argv[]) { .............................. struct sockaddr_in server_addr; //用于记录网络地址 struct hostent *host; if((host=gethostbyname(argv[1]))==NULL) { fprintf(stderr,"Gethostname error\n"); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket Error:%s\a\n",strerror(errno)); exit(1); } bzero(&server_addr,sizeof(server_addr)); // 初始化,置0 server_addr.sin_family=AF_INET; // IPV4 server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址 . . . } 以上是利用TCP 在服务器与客户端进行信息传输的一段程序,是客户端的程序,这段程序中有两点我不是很明白: 1、gethostbyname(argv[1]))应该是获取的主机的IP地址,但它的返回值是指向结构体 hostent 的指针。那么这个主机的IP地址存到了哪里?怎么存的? 2、server_addr.sin_addr=*((struct in_addr *)host->h_addr); // IP地址 这一句是将host指针所指向的结构中的地址赋给server_addr.sin_addr,但=之后应该客户端(client)的地址,=之前应该是服务器地址,为什么要让服务器地址等于客户端地址? 不知道我的理解有没有错误的地方,有的话请指出。。请诸位大神各抒己见,在线等诸位回答。。
简要回复一下你的两个问题。 第一个问题 gethostbyname的输入参数argv[1]是一个字符串,例如"192.168.0.1"或者"www.baidu.com",该函数返回一个指向struct hostent类型的结构体指针,这个结构体里面就包含了IP地址等信息。 你可以查看一下struct sockaddr和struct hostent等结构体的定义,还有gethostbyname的函数声明。 第二个问题 赋值号右边的IP地址就是服务器的地址,而不是你理解的客户端地址。 我猜你认为gethostbyname是返回本机IP地址的,这么理解是不对的。 gethostbyname("localhost")或者gethostbyname("127.0.0.1")确实返回了本机地址,但是你如果是gethostbyname("www.baidu.com")应该会返回百度的IP地址。

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧