I'm writing a winsock application, but i have problems with some winsock structures where unions are used.

Particulary with this one ( this is the C definition from whinsock2.h):


struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
/* can be used for most tcp & ip code */
#define s_host S_un.S_un_b.s_b2
/* host on imp */
#define s_net S_un.S_un_b.s_b1
/* network */
#define s_imp S_un.S_un_w.s_w2
/* imp */
#define s_impno S_un.S_un_b.s_b4
/* imp # */
#define s_lh S_un.S_un_b.s_b3
/* logical host */
};

I ended with following fasm definition. It works fine, but i know it isn't quite correct

struc in_addr
{
.S_un dd 0
virtual at .S_un
.S_un_b _S_un_b
end virtual
virtual at .S_un
.S_un_w _S_un_w
end virtual
virtual at .S_un
.S_addr dd 0
end virtual

.s_addr equ .S_addr ;#define s_addr S_un.S_addr
; /* can be used for most tcp & ip code */
.s_host equ .S_un_b.s_b2 ;#define s_host S_un.S_un_b.s_b2
; /* host on imp */
.s_net equ .S_un_b.s_b1;#define s_net S_un.S_un_b.s_b1
;/* network */
.s_imp equ .S_un_w.s_w2;#define s_imp S_un.S_un_w.s_w2
;/* imp */
.s_impno equ .S_un_b.s_b4;#define s_impno S_un.S_un_b.s_b4
;/* imp # */
.s_lh equ .S_un_b.s_b3;#define s_lh S_un.S_un_b.s_b3
;/* logical host */
}

struc _S_un_b
{
.s_b1 db 0
.s_b2 db 0
.s_b3 db 0
.s_b4 db 0
}
struc _S_un_w
{
.s_w1 dw 0
.s_w2 dw 0
}

Any ideas how to correctly define in_addr in a way that .S_un_b, .S_un_w and .S_addr members are accesible thru .S_un?
Here is attached a sample test application

Posted on 2002-12-01 07:27:54 by rdo