brew平台中使用Socket应该注意的问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

很多初学者在使用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);

现在看看,是不是正常了:〉好运

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航