很多初学者在使用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);
现在看看,是不是正常了:〉好运

|