博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux网络编程学习总结
阅读量:3936 次
发布时间:2019-05-23

本文共 5571 字,大约阅读时间需要 18 分钟。

目录

 

三、

 


 

 一、传输协议

TCP(即传输控制协议)

      1、 是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)

            适用情况:
                适合于对传输质量要求较高,以及传输大量数据的通信。
                在需要可靠数据传输的场合,通常使用TCP协议
                MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

 UDP 用户数据报协议

       1、是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

            适用情况:
                发送小尺寸数据(如对DNS服务器进行IP地址查询时)
                在接收到数据,给出应答较困难的网络中使用UDP。(如:无线网络)
                适合于广播/组播式通信中。
                MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
                流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
      

 IP地址

       IP地址是Internet中主机的标识

                Internet中的主机要与别的机器通信必须具有一个IP地址
                IP地址为32位(IPv4)或者128位(IPv6)
                每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由
      

端口号

         为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别

        

字节序

        1、 不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO):

               小端序

                    低序字节存储在低地址将低字节存储在起始地址
                大端序
                    高序字节存储在低地址

       2  、 字节序转换函数

                主机字节序到网络字节序

                    u_long htonl (u_long hostlong);
                    u_short htons (u_short short);
                网络字节序到主机字节序
                    u_long ntohl (u_long hostlong);
                    u_short ntohs (u_short short);

       3、 地址转换函数

                inet_aton

                     int inet_aton(const char *cp, struct in_addr *inp);
                    将cp所指c字符串转换成一个32位的网络字节序二进制值,并通过指针inp来储存,若成功值返回1,否则返回0
                     in_addr_t inet_addr(const char *cp);进行相同的转换
                inet_ntoa
                      char *inet_ntoa(struct in_addr in);

                inet_pton

                     int inet_pton(int af, const char *src, void *dst);
                        af参数既可以是AF_INET,也可以是AF_INET6
                        这个函数转换字符串到网络地址,第一个参数是地址族,转换后存在dst中,inet_pton是inet_addr的扩展
                inet_ntop
                     const char *inet_ntop(int af, const void *src,
                             char *dst, socklen_t size);
                        这个函数转换网络二进制结构到ASCLL类型的地址,参数的作用和上面相同,只是多了一个socklen_t 出纳台,它是所指向                    缓存区dst的大小,避免溢出,
  

二、 tcp传输协议(socket)

 socket:一种通用的网络编程接口

 服务器:

 创建套接字  socket 

                int socket(int domain, int type, int protocol);                int domain家族协议(IPV4----AF_INET,IPV6---AF_INET6 )                int type套接字类型(TCP----SOCK_STREAM,UDP-----SOCK_DGRAM)                int protocol 默认0                返回值:成功返回套接字描述符,失败返回-1

绑定(端口号,ip)  bind 

                int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);                int sockfd套接字描述符                const struct sockaddr *addr服务器地址,端口号(struct sockaddr_in)--》                 在/usr/include/linux/in.h 有该结构体说明                socklen_t addrlen地址长度

 监听 listen

                int listen(int sockfd, int backlog);                sockfd:套接字描述符                backlog:监听个数                返回值:成功0, 失败-1

 接受链接请求(成功创建一个新的套接字-与客户端通信) accept(如果没有客户端连接函数处于阻塞)

                int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);                int sockfd服务器套接字描述符                struct sockaddr *addr保存客户端信号                socklen_t *addrlen保存客户端信息长度                返回值:成功新的套接字描述符,失败-1

发送数据给客户端     write
接收客户端发来的数据  read(阻塞)
关闭套接字int close(int sockfd);

 客户端

创建套接字 socket 

建立链接--成功   connect

                int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);                 int sockfd服务器套接字描述符                struct sockaddr *addr连接的服务器地址信息                socklen_t *addrlen地址信息长度

 接收数据   read 
 发送数据   write 
 关闭套接字close

 IP地址转换函数

    int inet_aton(const char *cp, struct in_addr *inp);    in_addr_t inet_addr(const char *cp);    in_addr_t inet_network(const char *cp);    char *inet_ntoa(struct in_addr in);    struct in_addr inet_makeaddr(int net, int host);    in_addr_t inet_lnaof(struct in_addr in);    in_addr_t inet_netof(struct in_addr in)

三、udp

单播:一对一通信

 数据发送端

  1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)

  2.往指定的地址发送数据(ip,端口号)sendto

                    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,                    const struct sockaddr *dest_addr, socklen_t addrlen);                    int sockfd套接字                    const void *buf要发送的数据                    size_t len发送数据的长度                    int flags默认为0                    const struct sockaddr *dest_addr发送到地址                    socklen_t addrlen地址的长度                    返回值:成功发送的字节数

数据接收端

  1.创建套接字socket

  2.绑定地址、端口号bind 
 3.接收数据recvfrom

                    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                    struct sockaddr *src_addr, socklen_t *addrlen);                    sockfd:标识一个已连接套接口的描述字                    buf:接收数据缓冲区                    len:缓冲区长度                    flags:调用操作方式                    src_addr:(可选)指针,指向装有源地址的缓冲区                    addrlen::(可选)指针,指向from缓冲区长度值

 广播:一对多通信(局域网)(socket默认情况下广播是关闭

 广播发送端

1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)

 2.设置socket广播属性

int on = 1;setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

3.往指定的地址发送数据(ip,端口号)sendto

                    size_t sendto(int sockfd, const void *buf, size_t len, int flags,                    const struct sockaddr *dest_addr, socklen_t addrlen);                    int sockfd套接字                    const void *buf要发送的数据                    size_t len发送数据的长度                    int flags默认为0                    const struct sockaddr *dest_addr发送到地址(广播地址192.168.1.255)                    socklen_t addrlen地址的长度                    返回值:成功发送的字节数

 广播接收端

1.创建套接字socket
2.绑定地址、端口号bind
3.接收数据recvfrom

                    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                    struct sockaddr *src_addr, socklen_t *addrlen);

 组播:一对多通信

 组播发送端

  1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)

  2.往指定的地址发送数据(ip,端口号)sendto  (地址224.0.0.0--224.0.0.255)

                    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,                    const struct sockaddr *dest_addr, socklen_t addrlen);

  组播接收端

 1.创建套接字socket(家族协议,通信协议SOCK_DGRAM, 0)

 2.绑定地址、端口号bind
 3.加入组播组

struct ip_mreq mreqmreq.imr_multiaddr.s_addr = inet_addr("224.0.0.100");mreq.imr_interface.s_addr = INADDR_ANY;setsockopt(套接字描述符, 层级别(网络层SOL_IP),添加/退出(命令), &mreq, mreq结构体长度);            添加IP_ADD_MEMBERSHIP            退出IP_DROP_MEMBERSHIP

 4.接收数据

     ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,              struct sockaddr *src_addr, socklen_t *addrlen);

 

 

 

 

 

 

转载地址:http://bezwi.baihongyu.com/

你可能感兴趣的文章
Linux vi编辑器命令详解
查看>>
Linux常用命令之man/mv/shutdown/history
查看>>
Linux rz和sz命令详解
查看>>
Python 函数之函数定义、调用、传参
查看>>
Python 函数之参数、局部变量
查看>>
Python模块
查看>>
Python 包
查看>>
Python 异常处理
查看>>
Python 集合set
查看>>
Linux 系统状况之查看用户
查看>>
Linux用户和用户组管理
查看>>
Linux 磁盘管理
查看>>
Linux 内存及cpu解析
查看>>
Python时间模块之Time模块解析
查看>>
Python 文件操作
查看>>
Python 实现队列
查看>>
Python 实现栈
查看>>
Python 冒泡排序
查看>>
MySQL数据文件及常用工具
查看>>
Linux下解决命令未找到的问题
查看>>