键入将IPv4和IPv6结构转换为通用结构 [英] Type Casting IPv4 and IPv6 structures to Generic Structures

查看:52
本文介绍了键入将IPv4和IPv6结构转换为通用结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



设置TCP客户端时,我正在努力解决类型转换的概念。


这是一个代码片段(由W修改)理查德史蒂文斯Unix编程

书来证明我在哪里挣扎:


int sockfd;

struct sockaddr_in servaddr;


bzero(& servaddr,sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons (13); / * PORT 13 * /


/ * argv [1] =" 127.0.0.1" * /


if(inet_pton(AF_INET,argv [1],& servaddr.sin_addr))< = 0){

perror(" inet_pton()");

exit(1);

}


if((connect(sockfd,(struct) sockaddr *)& servaddr,sizeof(servaddr))<

0){

perror(" connect()");

退出(1);

}


当这一行出现时:


(struct sockaddr *) & servaddr


servaddr中先前分配的值是对结构的类型转换

sockaddr,

定义为:


struct sockaddr {

uint8_t sa_len;

sa_family_t sa_family;

char sa_data [14]; < br $>
};


我的困惑是如何填充sa_data [14]。我没有

了解转换。


任何人都可以帮助我吗?


我通过代码创建了一个类型为struct sockaddr的指针

和pointe d它到servaddr的地址。但我不明白

为什么sa_data [14]的数据看起来像是\111 \\\\\\\ 0。 。 。

我也不明白如何将该字符串转换回原来的

表格。


任何帮助都会我很感激。


谢谢,


Brian


PS我正在使用gcc进行编译,并使用gdb进行调试。

解决方案

tweak写道:

I在设置
TCP客户端时,我正在努力解决类型转换的问题。

这是一个代码片段(从W. Richard Stevens Unix
编程书中修改)到演示我在哪里挣扎:




尝试comp.unix.programmer或(也许)comp.os.linux.development.apps


我不明白为什么类型转换结构会特定于unix。

您应该可以跨平台执行此操作。我在这里张贴

来了解两个结构之间的转换。我没有理解整数到char []类型转换发生的时候

我写的时候:


(struct sockaddr *) & servaddr


我可以设置struct sockaddr类型的指针,并在gdb中看到

转换。我只是不明白。


这里有一些代码可以做到这一点;


struct sockaddr * test;


test =(struct sockaddr *)& servaddr


以上只是将地址传递给指针测试。

现在在gdb中,我可以显示* test并查看结构中的'b
'。但我不明白char []

转换。


谢谢,


Brian


PS我用另一个名字再次发布了这个帖子,希望

获得关于转换的一般C答案,而不用惊吓

远离那些没有插入套接字编程的人。 br $>
Grumble写道:

tweak写道:

我在设置
时遇到了类型转换的概念一个TCP客户端。

这是一个代码片段(修改自W. Richard Stevens Unix
编程书)来演示我在哪里挣扎:



尝试comp.unix.programmer或(也许)comp.os.linux.development.apps



" tweak" < BW ******** @ cox.net>在消息中写道

news:us_xc.30344


I''m struggling with the concept of typecasting when
setting up a TCP client.

Here''s a code snip (modified from W. Richard Stevens Unix Programming
book) to demonstrate where I am struggling:

int sockfd;
struct sockaddr_in servaddr;

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* PORT 13 */

/* argv[1] = "127.0.0.1" */

if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr)) <= 0 ) {
perror("inet_pton()");
exit(1);
}

if ( (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) <
0) {
perror("connect()");
exit(1);
}

When this line occurs:

(struct sockaddr *) &servaddr

the previously assigned values within servaddr are typecast to struct
sockaddr,
which is defined as:

struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};

My confusion is how sa_data[14] becomes populated. I do not
understand the conversion.

Can anyone help me out?

I stepped through the code creating a pointer of type struct sockaddr
and pointed it to the address of servaddr. But I do not understand
why sa_data[14] would have data looking like \111\0\r\0\0 . . .
nor do I understand how to convert that string back to it''s original
form.

Any help would be appreciated.

Thanks,

Brian

P.S. I''m compiling using gcc, and debuggin with gdb.

解决方案

tweak wrote:

I''m struggling with the concept of typecasting when setting
up a TCP client.

Here''s a code snip (modified from W. Richard Stevens Unix
Programming book) to demonstrate where I am struggling:



Try comp.unix.programmer or (perhaps) comp.os.linux.development.apps


I do not see why typecasting structures would be specific to unix.
You should be able to do this across platforms. I am posting here
to find out about the conversion between the two structures. I
do not understand the integer to char[] type conversion happening
when I write:

(struct sockaddr *) &servaddr

I can setup a pointer of type struct sockaddr and see in gdb
the conversion. I just don''t understand it.

Here''s some code to do that;

struct sockaddr *test;

test = (struct sockaddr *) &servaddr

the above just passes the address to the pointer test.

Now in gdb, I can do a display of *test and see what''s
in the structure. But I do not understand the char[]
conversion.

Thanks,

Brian

P.S. I posted this thread again under a different name, hoping
to get general C answers about the conversion without scaring
away folks that haven''t messed with socket programming.
Grumble wrote:

tweak wrote:

I''m struggling with the concept of typecasting when setting
up a TCP client.

Here''s a code snip (modified from W. Richard Stevens Unix
Programming book) to demonstrate where I am struggling:


Try comp.unix.programmer or (perhaps) comp.os.linux.development.apps



"tweak" <bw********@cox.net> wrote in message
news:us_xc.30344


这篇关于键入将IPv4和IPv6结构转换为通用结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆