zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    USACO Sabotage
    USACO Telephone Lines
    NOIP 2012 借教室
    洛谷 P1902 刺杀大使
    VIJOS-P1450 包裹快递
    JDOJ 1770 埃及分数
    USACO Monthly Expense
    7.modifier插件的自定义和使用
    6.function自定义插件的方法和使用
    5.Smart使用内置函数或者自定义函数
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/887839.html
Copyright © 2011-2022 走看看