首先看下函数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));~~~~~