很多初学者在使用isocket_connect 时总是头痛万分,替别是java等面向对象的程序员,更加容易受到面向对象的思维定势的影响,想当然的认为inadder和inport的格式应该就是如150.236.41.188和80等,而实际上,错了。
int isocket_connect
(
isocket * pisocket,
inaddr a,
inport wport,
pfnconnectcb pfn,
void * puser
)
错在哪?在使用socket进行通信时,一定要注意inaddr 和inport的书写格式:它们以网络字节顺序(既,高位优先)排列。如果以上面劣质来说,上面的写法更多的写成188.41.236.150和20480,怎么会这样?搞什么搞?ip的地址我还能看懂一些了。端口就更是面目全非了!
别紧张慢慢道来:
先说简单的inaddr, inaddr 表示 ip 套接字或终点的 ip 地址网络字节顺序值
它是: typedef uint32 inaddr; 三十二位的无符号整形存储ip地址.储存格式为每八位的bit储存一个ip段。高位优先排列.
以ip串为150.236.41.188为例:即
inaddr inaddr=(188<<24)|(41<<16)|(236<<8)|150.
再说说更加让面向对象程序员郁闷的可能是inport它也是这么反位储存的。
inport 表示 ip 套接字或终点的端口网络字节顺序值
typedef uint16 inport
如80,正常储存为:
0000 0000 0101 0000
而在这里应该是:
0101 0000 0000 0000
因此你要做如下转化才能正常使用:
port =正常思维下的数字:
inport inport=(port%256)|(port>>8<<8);
现在看看,是不是正常了:〉好运![]()