connect()函数的使用问题

首先看下函数connect()原型

int
WSAAPI
connect(
    __in SOCKET s,
    __in_bcount(namelen) const struct sockaddr FAR * name,
    __in int namelen
    );

标准调用约定,第二个参数是const struct sockaddr FAR *name为sockaddr类型的指针。

然后在看下sockaddr结构

typedef struct sockaddr {

#if (_WIN32_WINNT < 0x0600)
    u_short sa_family;
#else
    ADDRESS_FAMILY sa_family;           // Address family.
#endif //(_WIN32_WINNT < 0x0600)

    CHAR sa_data[14];                   // Up to 14 bytes of direct address.
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;

u_short sa_family,协议对应的地址族,WinSoc可中是一AF_*开始的宏,如AF_INET,AF_UNIX,AF_ISO,对TCP/IP的ipv4类型为AF_INET

sa_data,,存储与协议无关的地址信息,不同协议族可以有不同的地址格式

这样,socket接口中需要使用地址结构的参数就可以使用通用socket地址结构,而应用程序和网络模块根据sa_family对sa_data做出正确的解释。不同的协议族可以有不同的的

地址格式,编程时使用与协议有关的地址结构,但在传递给socket接口函数时,需要转换通用的socket地址结构

如下:

struct sockaddr_in local_addr;//socket的本地地址

local_addr.sinfamily=AF_INET;

local_addr.sin_port=tons(1025);

local_addr.sin_addr.s_addr=INADDR_ANY;

bind(sock,(struct sockaddr*)&local_addr,sizeof(struct sockaddr));通用socket地址结构提供了用户的统一的接口,当增加新的协议或地址族时,不用再修改已有的接口函数,

只需要提供提供与协议相关的地址结构,具有良好的可扩展性。

同样connect函数可以这样用

::connect(s,(sockaddr*)&servAddr,sizeof(servAddr));~~~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值