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