4.4.3 绑定套接字

来源:互联网 发布:sopcast网络电视url 编辑:程序博客网 时间:2024/06/07 02:24

  bind()函数完成套接字绑定。该函数的第一个参数是新创建套接字,第二个参数是服务器地址,第三个参数是地址结构大小。在程序中使用INADDR_ANY值作为网络地址,这意味着网络服务器提供者将使用适合的网络地址进行绑定。

如果该函数调用失败,则在调用HandleSocketError()函数之前,应先将套接字关闭。

绑定套接字的程序清单如下。

#define     SERVERPORT                             5555                   //服务器TCP端口

//服务器套接字地址

SOCKADDR_IN addrServ;

addrServ.sin_family = AF_INET;

addrServ.sin_port = htons(SERVERPORT);

addrServ.sin_addr.s_addr = INADDR_ANY;

//绑定套接字

retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));

if(SOCKET_ERROR == retVal)

{

         closesocket(sServer);                                            //关闭套接字

         return HandleSocketError("Failed bind()!");       //错误处理

}

Windows Sockets中存在三种有关地址的结构。

1in_addr为网络地址结构,大小为4个字节。

该结构声明如下:

struct in_addr {

        union {

                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;

                struct { u_short s_w1,s_w2; } S_un_w;

                u_long S_addr;

        } S_un;

}

在应用程序中,调用inet_ntoa()inet_add()函数实现,网络地址和“.”点间隔的字符串地址之间的转换。下面程序清单示例,将“.”间隔的字符串地址转为网络地址,和将网络地址转换为“.”间隔的字符串地址的方法。

unsigned long ulAddr = inet_addr("192.168.1.100");

char* pAddr = inet_ntoa(*(in_addr*)(&ulAddr));

2SOCKADDR_INsocket地址结构,包含了地址家族、网络地址和端口等信息。

此结构被Windows Sockets用来指定将要连接本地或者远端的地址。该结构16字节大小,可以与SOCKADDR结构相互转换。

该结构声明如下:

struct sockaddr_in {

        short   sin_family;

        u_short sin_port;

        struct  in_addr sin_addr;

        char    sin_zero[8];

};

q        sin_family:地址家族,必须为AF_INET

q        port:端口。

q        sin_addrin_add类型的IP地址。

q        sin_zero:填充该结构的大小,使之与SOCKADDR结构大小相同。

3SOCKADDR结构

该结构依据所使用协议的不同而不同,被内核用于存储地址,大小16字节。在TCP/IP协议下,使用SOCKADDR_IN结构代替该结构。

该结构声明如下。

struct sockaddr {

        u_short  sa_family;

        char   sa_data[14];

};

当调用bind()函数绑定套接字时,将SOCKADDR_IN结构类型强制转换为SOCKADDR结构类型,作为该函数的第二个参数。

原创粉丝点击