键入将IPv4和IPv6结构转换为通用结构 [英] Type Casting IPv4 and IPv6 structures to Generic Structures
问题描述
设置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屋!