Winsock编程入门 4.面向连接的通讯

    面向连接的通讯是通过TCP/IP协议来实现的.TCP实现了两台计算机之间可靠数据传输.当应用程序通过TCP通讯时,目标和源计算机之间就建立了一个虚拟连接,一旦连接建立,就可以在目的和源计算机之间进行双向的数据流传输.

服务器API涵数

    服务器是一个等待任意数量的客户连接的进程,其目的是为客户请求提供相应的服务.服务器必须用通用的命名对连接进行监听.在TCP/IP中,命名就是本地接口的IP地址和端口号.每一个协议都有着不同的寻址方式,因此其命名方法也不同.在Winsock编程中,第一步就是要调用socket或WSASocket并将Socket绑定到通用命名的协议.绑定是通过API方法bind完成的.接下来,将socket通过API函数listen设置为监听模式.最后当客户试图连接时,使用API函数accept或WSAAccept接受接连.

绑定

    一旦特定的协议被创建,你必须把它绑定到公开的地址,API函数associates将socket与公开的地址关联,其函数声明如下:

int bind(
    SOCKET                     s,
    const struct sockaddr FAR* name,
    int                        namelen
);

参数说明:

    s:表示等待客户连接的socket.
    name:是一个sockaddr结构, 你必须用使用的协议进行填充,并转换为sockaddr结构.Winsock的头文件将sockaddr结构定义为SOCKADDR类型. 
    namelen:是指定了协议的地址结构的长度.
 
    下面的示例说明了如何在TCP中使用bind:

    SOCKET               s;    
    SOCKADDR_IN          tcpaddr;
    int                  port = 5150;

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    tcpaddr.sin_family = AF_INET;
    tcpaddr.sin_port = htons(port);    
    tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(s, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));

    上例中,一个流socket被创建,接下来设置了用来接受客户连接的TCP/IP地址结构.在这个例子中,socket被绑定到了一个默认的特殊地址 -- INADDR_ANY,并占用了端口号5150.我们可以明确地指定一个IP地址,但INADDR_ANY充许我们绑定到系统中所有可用的接口,这样客户通过任意接口(当然端口号要正确)进行连接都会被我们的监听socket接受.调用bind通常使用本地IP和端口与socket建立关联.

    一旦出错, bind将返回SOCKET_ERROR. bind通常产生的错误是WSAEADDRINUSE.在TCP/IP中, WSAEADDRINUSE表示另外的进程已经绑定了本地IP与端口或者指定的IP与端口处于TIME_WAIT状态.如果你对已经绑定的socket调用bind就会返回WSAEFAULT.

原文地址:https://www.cnblogs.com/MaxWoods/p/887839.html