zoukankan      html  css  js  c++  java
  • UNIX环境高级编程——网络编程常用函数及结构

    IP地址的转换

    #include <arpa/inet.h> 

    int inet_aton(const char *strptr, 
                       struct in_addr *addrptr);
    //将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32)。

    int_addr_t inet_addr(const char *strptr)
    //功能通上,返回地址。
    in_addr addr;
    addr.s_addr = inet_addr("192.168.2.103");

    char *inet_ntoa(stuct in_addr inaddr);//32位IP->a.b.c.d形式的
    //将32位网络字节序二进制地址转换成点分十进制的串

    a代表ASCIIn代表network

    网络、主机字节序转换函数

    主机序转换到网络序:
    u_short htons (u_short short);
    u_long htonl (u_long  hostlong);

    网络序转换到主机序:
    u_short ntohs (u_short short);
    u_long ntohl (u_long hostlong);

    h(host),n(network),l(long),s(short)

    通过主机名访问网络

    主机结构体

    struct hostent
    {
        char *h_name;//主机的正式名称
        char *h_aliases;//主机的别名
        int  h_addrtype;//主机的地址类型 AF_INET
        int h_length;//主机的地址长度
        char **h_addr_list;//主机的IP地址列表
    }
    #define h_addr h_addr_list[0] //主机的第一个IP地址
    struct hostent *gethostbyname(const char *hostname)

    socket

    通用地址结构:

    struct sockaddr
    {
        u_short sa_family;//协议族
        char sa_data[14];//地址协议
    }

    Internet协议地址结构

    struct sockaddr_in
    {
        short int sin_family;//协议族
        unsigned short int  sin_port;//端口号
        struct in_addr sin_addr;//协议特定地址
        unsigned char si_zero[8];//未使用,填0
    }
    一般使用与sockaddr等价的sockaddr_in数据结构

    IPv4地址结构

    struct in_addr
    {
        u_long s_addr;
    }

    创建一个socket

    int socket(int domain,    //协议族
                      int type,    //套接字类型
                      int protocol)    //标识位
    头文件:
    #include <sys/types.h>
    #include <sys/socket.h>

    参数的选项:
    domain
    AF_INET//internet协议
    AF_UNIX//unix internal协议
    AF_NS//Xerox NS协议
    AF_IMPLINK//Interface Message协议
    type
    SOCK_STREAM//流式socket
    SOCK_DGRAM//数据报socket
    SOCK_RAW//raw socket
    protocol参数通常设置为0

    返回值:
    成功返回socket的描述符,
    失败返回-1.
                              

    用于绑定IP地址和端口号到socket

    int bind(int sockfd,    //由socket调用返回的文件描述符。
                  struct sockaddr *my_addr,    //指向sockaddr_in结构的指针,包含server IP的地址和端口号。
                  int addrlen);    //sockaddr结构的长度(sizeof(sockaddr_in))。
    返回值:
    成功0,失败-1;
                        


    设置服务器能处理的最大连接要求 

    #include <sys/socket.h>
    int listen(int sockfd,    //监听连接的socket。
                 int bakclog)    //请求排队的最大长度。

    listen()将bind的文件描述符变为监听套接字
    返回值:
    文件描述符或-1;

                                 


    等待客户端的socket连接请求 

    int accept (int sockfd,    //listen后的文件描述符,接收客户端连接的Socket。
                       struct sockaddr *addr,    //接收外来连接的地址信息。(若不需要可设置NULL)
                       socklen_t *addrlen);    //addr结构的长度。

    返回值:
    成功:新连接的Socket,(并使用其与客户进行通讯,原Socket继续接受其它客户的连接)。
    失败:-1

    与服务器建立连接

    int connect(int sockfd,    //socket返回的文件描述符
                         struct sockaddr *serv_addr,    // 服务器端的连接信息,.sin_add是服务端地址
                         int addrlen)    //serv_addr的长度
    头文件:
    #include <sys/types.h>
    #include <sys/socket.h>

    返回值:
    0或-1;
                               


    关闭双向通道
    int close (int sockfd);

    int shutdown(int sockfd,
                             int howto)    //SHUT_RD关闭读终端,SHUT_WR关闭写终端。

    返回值:
    成功:0
    失败:-1

    接收、发送数据(TCP)
    ssize_t recv(int socket, void *buffer, size_t length, int flages);//接收数据 
    ssize_t send(int socket, const void *buffer, size_t length, int flags)//发送数据
    头文件:
    #incldue <sys/socket.h>
    参数:
    socket: 已经连接的Socket。
    buffer: 指向用于接收数据的缓冲区的指针。
    length: 缓冲区的大小(字节)。
    flags: MSG_OOB或0(send()还有etc).
    返回值:
    成功接收或发送的字节数。
    失败返回-1,并设置errno。
    recv返回0,连接断开。
                            


    接收、发送数据(UDP)
    头文件:
    #include < sys/types.h >   
    #include < sys/socket.h >

    接收远程主机经指定的socket传来的数据(接收)
     
    ssize_t recvfrom(int sockfd,    //套接字描述符
                            void *buf,    //缓冲区
                            int len,    //可接收数据的最大长度.
                            unsigned int flags,    //一般设0,
                            struct sockaddr *from,    //指定欲传送的网络地址
                            socket_t *fromlen);    //结构长度

    ssize_t 相当于 int,socket_t 相当于int 。

    返回值:
    成功则返回接收到的字符数,
    失败返回-1. 


    将数据由指定的socket传给对方主机(发送)

    int sendto ( int s ,     //已建好连线的socket,如果利用UDP协议则不需经过连线操作
                    const void * msg,     //发送缓冲区
                    int len,     // 发送的数据大小
                    unsigned int flags,     //一般设0
                    const  struct sockaddr * to ,     //指定欲传送的网络地址
                    int tolen )     //sockaddr的结果长度

    返回值
    成功则返回实际传送出去的字符数,
    失败返回-1,并设置errno 。


    使用文件描述符的函数处理套接字时的行为

                                 



  • 相关阅读:
    【AGC010E】Rearranging(博弈,图论,拓扑排序)
    【ARC074F】Lotus Leaves(最小割)
    【ARC069F】Flags(2-SAT,Tarjan,线段树优化建图)
    [CTS 2019] 氪金手游
    HDU
    LOJ
    LOJ
    [TJOI 2015] 概率论
    [AGC 018F] Two Trees
    LOJ
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332628.html
Copyright © 2011-2022 走看看