• 网络编程基础之TCP编程学习(一)


    网络编程基础了解

    socket套接字

    socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段。

    linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符。一个完整的socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每个socket有一个本地唯一Socket,由操作系统分配。

    定位某个计算机用IP,定位某个服务用端口。

    创建Socket

    #include <sys/socket.h>

    int socket(int domain, int type, int protocol);

    返回:成功返回描述符,出错返回-1

    (详细可以利用 指令 man socket 查看)

    参数解释

    domain

      AF_INET    IPv4因特网域

      AF_INET6    IPv6因特网域

      AF_UNIX      unix

      AF_UNSPEC  未指定

    protocol

      通常为0,表示按给定的域和套接字类型选择默认协议。

    type(指定采用何种协议)

      SOCK_STREAM   采用TCP协议(流式的套接字可以提供可靠的面向连接的通信流)

      SOCK_DGRAM    采用UDP协议(数据报套接字)

      SOCK_RAW    主要用于新的网络协议实现的测试。

      SOCK_SEQPACKET 长度固定、有序、可靠的面向连接报文传递

      一般采用前两种方式。。。。。。。

     

    字节序

    字节序分为大端和小端字节序

    大端字节序:高字节在前,低字节在后

    小端字节序:低字节在前,高字节在后

     不同体系采用不同的字节序

    网络字节序:在网络中使用的字节序称为网络字节序,采用大端字节序。

     

    字节序的转换函数

    网络传输的数据一定要统一顺序,所以需要字节序转换

    uint32_t htonl(uint32_t hostlong); 将一个32位整数由主机(host)字节序转换成网络(network)字节序

    uint16_t htons(uint16_t hostshort); 将一个16位整数由主机(host)字节序转换成网络(network)字节序

    uint32_t ntohl(uint32_t netlong); 将一个32位整数由网络(network)字节序转换成主机(host)字节序

    uint16_t ntohs(uint16_t netshort); 将一个16位整数由网络(network)字节序转换成主机(host)字节序

     

    地址结构

    通用地址结构

    #include <sys/socket.h>

    struct sockaddr{

      unsigned short sa_family;    //Internet地址族,AF_XXX

      char sa_data[14];      //14bytes的协议地址

    }

    //一般不用

     

    因特网地址结构

    struct in_addr{

      in_addr_t s_addr;    //ipv4地址

    };

    struct sockaddr_in{

      short int sin_family;      //Internet地址族如AF_INET(主机字节序)

      unsigned short int sin port;    //端口号,16位值(网络字节序)将数据转换之后赋值

      struct in_addr sin_addr;      //Internet地址,32ipv4地址(网络字节序)要将点分十进制转换成网络字节序,转化函数如下

      unsigned char sin_zero[8];    //0(为了格式对其的填充位)

    };

     

    点分十进制转、网络字节序转换函数

    #include <arp/inet.h>//头文件

    const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size);

    返回:成功返回地址字符串指针,出错返回NULL

    功能:网络字节序转换成点分十进制 如:127.0.0.1

     

    int inet_pton(int domain, const char *restrict str, void *restrict addr);

    返回:成功返回1, 无效格式返回0, 出错返回-1

    功能:点分十进制转换成网络字节序

    (详情可利用指令 man inet_pton 查看函数)

    参数

    domain:Inter 地址族,如AF_INET

    addr: Internet地址,32IPv4地址(网络字节序)

    str:地址字符串(点分十进制)指针

    size:地址字符串大小

     

    案例

    struct sockaddr_in sockin;    //定义一个结构体

    char buff[16];

    memset(&sockin, 0, sizeof(sockin));

    sockin.sin_family = AF_INET;    //地址族

    sockin.sin_port = htons((short)8888); //端口号,必须是网络字节序

    //填充sin_addr 需要将点分十进制转换为网络字节序

    if(inet_pton(AF_INET,"127.0.0.1",&sockin.sin_addr.s_addr) <= 0)

    {

      //进行错误处理

    }

    printf("%s ",inet_ntop(AF_INET, &sockin.sin_addr.s_addr, buff, sizeof(buff)));

     

    TCP编程模型

    客户端调用序列

      调用socket函数创建套接字

      调用connect连接服务器端

      调用I/O函数(read/write)与服务器端通讯

      调用close关闭套接字

    服务器端调用序列

      调用socket函数创建套接字

      调用bind绑定本地地址和端口

      调用listen启动监听

      调用accept从已经连接的队列中提取刻苦连接

      调用I/O函数(read/write)与客户端通讯

      调用close关闭套接字

     

     

    相关函数

     套接字与地址绑定

      绑定地址

      #include <sys/socket.h>

      int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

      返回:成功返回0,出错返回-1;

      

      查找绑定到套接字的地址

      #include <sys/socket.h>

      int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);

      返回:成功返回0,出错返回-1

     

      获取对方地址

      #include<sys/socket.h>

      int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);

      返回:成功返回0,出错返回-1

     

     建立连接

      服务器端

      #include <sys/socket.h>

      int listen(int sockfd, int backlog);

      backlog 指定进行客户端连接排队的队列长度。

      int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict len);

     

      客户端

      #include <sys/socket.h>

      int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

     

     

     

    下一节,编写一个简单的TCP程序

  • 相关阅读:
    LA 6891 Money Transfers(最短路)
    Gym
    UVa 1662 Brackets Removal
    Gym 101334F Feel Good
    Gym 101334E Exploring Pyramids(dp+乘法原理)
    POJ 2112 Optimal Milking(二分+最大流)
    POJ 2115 C Looooops(模线性方程)
    UVa 11552 最小的块数(序列划分模型:状态设计)
    UVa 10534 波浪子序列(快速求LIS)
    UVa 10891 Sum游戏
  • 原文地址:https://www.cnblogs.com/lttdxuexizhilu/p/11603863.html
Copyright © 2020-2023  润新知