Chinaunix

标题: 为什么我的sockaddr 结构打印出来的结果为空 [打印本页]

作者: cdma313    时间: 2008-10-19 18:02
标题: 为什么我的sockaddr 结构打印出来的结果为空
我对servaddr_in结构强制转换为servaddr结构,但是我打印servaddr_tmp.sa_data结果为空,这是怎么回事,谢谢各位老大了?

以下是我的部分源码:

struct sockaddr_in  servaddr;
    struct sockaddr     servaddr_tmp;
    char                buff[MAXLINE];
    time_t              ticks;

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    bzero(&servaddr_tmp, sizeof(servaddr_tmp));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY;
    servaddr.sin_port        = htons(13);   /* daytime server */
   
    servaddr_tmp = *(struct sockaddr *)&servaddr;

    printf("tmp.sa_family = %d, tmp.port = %s\n",
            servaddr_tmp.sa_family, servaddr_tmp.sa_data);
作者: cdma313    时间: 2008-10-19 18:03
我的sin_family协议信息可以打印出来为2,但是端口和IP信息怎么不能打印了。
作者: tyc611    时间: 2008-10-19 18:08
不能以%s打印这里的地址,你先弄明白%s表示啥意思
作者: cdma313    时间: 2008-10-19 18:12
标题: 回复 #3 tyc611 的帖子
楼上的兄弟,如果我要打印IP和端口信息应该怎么打印,谢谢了
作者: tyc611    时间: 2008-10-19 18:15
原帖由 cdma313 于 2008-10-19 18:12 发表
楼上的兄弟,如果我要打印IP和端口信息应该怎么打印,谢谢了

要打印IP,可以使用inet_ntoa()把32地址转换为字符串形式输出
要打印端口,应该调用ntohs()把网络字节序的端口转换为主机字节序
作者: cdma313    时间: 2008-10-19 18:17
标题: 回复 #4 cdma313 的帖子
有哪位兄弟知道,  struct sockaddr中的char    sa_data[14] 中的sa_data[14]数组存储的是什么信息,我怎么从sa_data中取得端口信息和IP信息,谢谢
作者: tyc611    时间: 2008-10-19 18:18
原帖由 cdma313 于 2008-10-19 18:17 发表
有哪位兄弟知道,  struct sockaddr中的char    sa_data[14] 中的sa_data[14]数组存储的是什么信息,我怎么从sa_data中取得端口信息和IP信息,谢谢

把struct sockaddr转换为struct sockaddr_in,再取得ip和端口
作者: cdma313    时间: 2008-10-19 18:18
谢谢楼上兄弟的回复
作者: cdma313    时间: 2008-10-19 18:20
标题: 回复 #8 cdma313 的帖子
可不可以把struct sockaddr_in转换为struct sockaddr
作者: tyc611    时间: 2008-10-19 18:22
原帖由 cdma313 于 2008-10-19 18:20 发表
可不可以把struct sockaddr_in转换为struct sockaddr

可以根据需要相互转换
作者: cdma313    时间: 2008-10-19 18:28
谢谢楼上的大哥的回复
sockaddr 结果中怎么取得端口信息用哪个函数?
作者: tyc611    时间: 2008-10-19 18:34
原帖由 cdma313 于 2008-10-19 18:28 发表
谢谢楼上的大哥的回复
sockaddr 结果中怎么取得端口信息用哪个函数?

sockaddr addr;
// ...
struct sockaddr_in *p = (struct sockaddr*)&addr;
short port = ntohs(p->sin_port);

lz,回去看书吧
作者: cdma313    时间: 2008-10-19 19:18
如果不把sockaddr 强制转换为sockaddr_in结构,能不能用什么函数取得地址和端口信息?
强制这种方法我会。谢谢
作者: tyc611    时间: 2008-10-19 19:45
原帖由 cdma313 于 2008-10-19 19:18 发表
如果不把sockaddr 强制转换为sockaddr_in结构,能不能用什么函数取得地址和端口信息?
强制这种方法我会。谢谢

你要获得IPv4的地址和端口,你就需要按sockaddr_in来解释sockaddr,没有它法(本质上只有这种方法)




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2