zoukankan      html  css  js  c++  java
  • 套接字相关函数

    加载套接字库并进行版本协商
    Int WSAStartup(WORD wVersionRequested,
    //请求的版本号,低字节代表主版本,高字节代表副版本,一般我们用MAKEWORD(x,y)//宏来指定版本号,如:MAKEWORD(2,1)代表2.1的版本
    LPWSADATA lpWSAData//一个WSADATA结构体指针,用于接收实际加载的套接字 库版本号
    )

    创建套接字
    SOCKET socket(int af, //指定协议族,也即网际域,对于windows平台总是AF_INET 或 PF_INET
    Int type,//指定要创建的套接字类型,SOCK_STREAM,SOCK_DGRAM
    Int protocol)//指定协议类型,我们一般设为0,让他根据我们前两个参数自动设置

    绑定到本机地址和端口
    int bind(SOCKET s, //已创建的套接字描叙符
    const struct sockaddr FAR *name, //要绑定的本机地址信息
    Int namelen)//第二个参数的长度
    其中要注意第二个参数,由于第二个参数适用于所有网络协议,所以我们可以根据需要进行替换,如我们常常这样定义一个AF_INET 的地址信息:

    SOCKADDR_IN SrvAddr;
    SrvAddr.family=AF_INET;
    SrvAddr.port=htons(666); //其中666代表端口号
    SrvAddr.sin_addr.S_un.S_addr=htonl(192.168.1.101);
    //或SrvAddr.sin_addr.S_un.S_addr=INADDR_ANY;(指绑定到本机的任一快网卡上,并且////其本身就是网络字节序,故无需转换,我推荐这种写
    法)

    Inet_addr和inet_ntoa函数
    Unsigned long Inet_addr(sconst char FAR * cp);
    Inet_addr可以把一个点分十进制表示的IP(如:192.168.1.101)转换为unsinged long 类型的数据,且该返回值可以直接赋值给S_addr
    Char FAR * inet_ntoa(struct in_addr in);
    Inet_ntoa 从他函数的声明就知道他完成一个和inet_addr相反的转换 。

    将指定的套接字设为监听模式
    Int listen(SOCKET s,int backlog);
    第一个参数 s: 已经创建的套接字描述符
    第二个参数 backlog 设置等待连接队伍的最大长度,注意:不是一个端口上可以同时连接的数目。

    接收客户端发送的连接请求
    SOCKET accept(
    SOCKET s,
    Struct sockaddr FAR * addr,// 返回请求连接方的IP和端口信息
    Int FAR * addrlen);//连接方内存块的长度,注意是指针类型

    通过一个已经建立连接的套接字发送数据
    Int send(
    SOCKET s,//注意:是以建立连接的套接字
    Const char FAR * buf,//目的地IP和端口信息
    Int len,
    Int falgs)//该设置影响发送行为,我们一般设为0

    接收数据函数
    Int recv(
    SOCKET s,
    Char FAR *buf,//发送数据的缓存地址
    Int len,//发送数据长度
    Int flags)//该设置影响发送行为,我们一般设为0

    和一个特定的套接字建立连接
    Int connect(
    SOCKET s,  //即将在基上连接的套接字
    Const struct sockaddr FAR * name,//目的地址信息
    Int namelen)

    接受一次数据并保存数据源地址信息
    Int recvfrom(
    SOCKET s,  //准备接受数据的套接字
    Char FAR*buf,  //指向缓冲区的指针,该缓冲区用来接受数据
    Int len,  //缓冲区的长度
    Int flags,
    Struct sockaddr FAR* from//用于保存数据源地址信息
    Int FAR* fromlen);
    注意:最后一个参数是in,out类型,我们要在传参之前赋初始值
    如:int len=Sizeof(SOCKADDR);

    向以一个特定的目的方发送数据
    Int sendto(
    SOCKET s,
    Const char FAR * buf,//要发送的数据
    Int len,//数据长度
    Int flags,
    Connect struct sockaddr FAR * to,//目的地址信息
    Int tolen)

    前面我们说了在socket通信中都采用网络字节序(高位先存),那么在实际的编程过程中必然少不了转换函数,这里介绍两个,htons和htonl
    U_short htons(u_short hostshort);
    U_long htonl(u_long hostlong);
    功能:把一个无符号短型/长性主机字节序的数据转换为网络字节序

  • 相关阅读:
    sitemesh包装工具
    关于对XML的处理
    关于打开tomcat的远程调试功能
    hdu4531 乾坤大挪移
    hdu4521 小明序列 (线段树 + DP)
    hdu4527 && hdu4528
    zoj3691 Flower
    pku2817 WordStack
    zoj3652 Maze
    zoj3381 Osaisen Choudai!
  • 原文地址:https://www.cnblogs.com/fenghuan/p/4869532.html
Copyright © 2011-2022 走看看