zoukankan      html  css  js  c++  java
  • 初始Winsock编程

    1、套接字的创建和关闭

      使用套接字之前,必须使用socket函数创建一个套接字,此函数调用成功将返回一个套接字句柄。

    1 SOCKET socket(
    2  int  af,   //用来指定套接字使用的地址格式,Winsock中只能使用AF_INET
    3  int  type,   //用来指定套接字的类型
    4  int  protocol    //配合type参数使用,用来指定使用的协议类型。可以是IPPROTO_TCP等   
    5 );

      type参数指定套接字的类型。套接字有流套接字、数据报套接字和原始套接字

      SOCK_STREAM  流套接字,使用TCP提供有连接的可靠的传输。

      SOCK_DGRAM   数据报套接字,使用UDP提供无连接的不可靠的传输。

      SOCK_RAW          原始套接字,由程序自行处理数据报以及协议首部。

      当type参数明确为SOCK_STREAM和SOCK_DGRAM时,protocol参数的值可为0。

      函数调用失败时返回INVALID_SOCKET(-1),可通过WSAGetLastError取得错误代码。

      当不使用创建的套接字时,应调用closesocket函数来关闭套接字。没有发生错误则返回0,否则返回SOCKET_ERROR。

    1 int closesocket(SOCKET s);   //函数唯一的参数就是要关闭的套接字

    2、绑定套接字到指定的IP地址和端口号:bind函数

    1 int  bind(
    2   SOCKET s,    //套接字句柄
    3   const struct sockaddr* name,    //要关联的本机地址
    4   int  namelen     //地址的长度
    5 )

      绑定函数安排一个本地名称到未命名的socket而建立此socket的本地关联。本地名称包括三部分:主机地址、协议号(TCP和UDP)和端口号。

    1 sockaddr_in sin;
    2 sin.sin_family = AF_INET;           //地址协议家族
    3 sin.sin_port    = htons(4567);     //端口
    4 sin.sin_addr.S_un.S_addr = INADDR_ANY;   //监听的IP地址
    5 if(::bind(sListen,(LPSOCKET)&sin,sizeof(sin)) == SOCKET_ERROR)
    6 {
    7      printf("Failed bind()
    ");
    8      return 0;
    9 }

    3、设置套接字进入监听状态:listen函数

    1 int listen(
    2 SOCKET s,      //套接字句柄
    3 int backlog     //监听队列中允许保持的尚未处理的最大连接数量
    4 );

       listen仅应用在支持连接的套接字上。函数执行成功后,套接字s进入被动模式,到来的连接会被通知要排队等候接受处理。

      在同一时间处理多个连接请求的服务器通常使用listen函数,如果一个连接请求到达,且排队已满,客户端将收到WSAECONNREFUSED错误。

    4、接受连接请求:accept函数

    1 SOCKET accept(
    2     SOCKET s,    //套接字句柄
    3     struct  sockaddr*  addr,   //一个指向sockaddr_in结构的指针,用于取得对方的地址信息
    4     int*  addrlen   //一个指向地址长度的指针
    5 );

      该函数默认工作在阻塞模式下。函数在s上取出未处理连接中的第一个连接,为这个连接创建新的套接字,返回它的句柄。新创建的套接字是处理实际连接的套接字,与s有相同的属性。

      addrlen参数用于指定addr所指空间的大小,也用于返回地址的实际长度。如果为NULL,则没有关于远程地址的信息返回。

      客户端程序在创建套接字之后,需要使用connect函数请求与服务器进行连接。

    1 int    connect(
    2     SOCKET s,    //套接字句柄
    3     const struc sockaddr FAR* name,   //一个指向sockaddr_in结构的指针,包含了要连接的服务器的信息
    4     int namelen     //sockaddr_in结构的指针
    5 );

      第一个参数所说的套接字句柄指的是客户端的套接字,而另外两个参数都是用来寻址远程套接字,即服务器端的监听套接字。

    5、收发数据

      对于流套接字,一般使用send和recv函数来收发数据。

    1 int    send(
    2 SOCKET  s,    //套接字句柄
    3 const  char FAR* buf,   //要发送数据的缓冲区地址
    4 int  len,      //缓冲区长度
    5 int  flags    //指定了调用方式,一般设为0
    6 );
    1 int    recv(SOCKET s,char FAR* buf,int len,int flags);

       最后解释一下什么是套接字及其作用:

      套接字是支持TCP/IP网络通信的基本操作单元,可以看做不同主机之间的进程进行双向通信的端点。简单说就是通信双方的一种约定,用套接字中的相关函数可以完成通信过程。

  • 相关阅读:
    《Android 4游戏高级编程(第2版)》书评
    push研究——Apache Mina探索初步
    Android UI开发第二十三篇——分享书架UI实现
    cookie学习总结
    Web.xml配置详解
    Java序列化的机制和原理
    Java高级技术(汇总中...)
    [Java]HashMap的两种排序方式
    jdk与jre的区别
    DM,NLP常用算法汇总
  • 原文地址:https://www.cnblogs.com/suvllian/p/5464877.html
Copyright © 2011-2022 走看看