• LINUX C网络编程学习笔记入门知识


    网络编程入门知识

    Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用。

    socket通常也称作"套接字",用于描述IP 地址和端口,是一个通信链的句柄,也可以看成是一种文件描述符 。socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。

    socket类型:

    ①。流式套接字(SOCK_STREAM)

    流式套接字可以提供可靠的,面向连接的通讯流,它使用TCP协议。

    ②。数据报套接字(SOCK_DGRAM) 

    数据报套接字定义了一种无连接的服务,数据报通过相互独立的报文进行传输,是无序的并且不保证可靠 ,它用UDP协议。

    ③。原始套接字(SOCK_RAM)

    原始套接字允许使用IP协议,主要用于新的网络协议的测试等。

    在socket程序设计中,struct sockaddr用于记录网络地址,其结构如下:

    struct sockaddr

     {

    u_short sa_family;//协议簇,采用AF_XXX形式,如AF_INET(IP协议簇)。

    char sa_data[14];  //  14字节的特定协议地址

     } 

    然而编程一般使用与sockaddr等价的sockaddr_in结构,sockaddr_in结构如下:

    struct sockaddr_in

    {

    short int sin_family ; //协议簇

    unsigned short int sin_port; //端口号

    struct in_addr sin_addr; //协议特定地址,具体结构看下面 ····

    unsigned char sin_zero[8]; //填0

     struct in_addr的结构如下:

    struct in_addr

    {

    union

    {

    struct{unsigned char s_b1,s_b2,s_b3,s_b4;}S_un_b; // An IPv4 address formatted as four u_chars.

    struct{unsigned short s_w1,s_w2;}S_un_w; // An IPv4 address formatted as two u_shorts

    unsigned long s_addr; // An IPv4 address formatted as a u_long.

    }S_un;

     地址转换

    int inet_aton(const char *cp,struct in_addr *inp);

    char *inet_ntoa(struct in_addr *inp); 

    函数里面的 a 代表 ASCII,n 代表 network

    inet_aton函数是将a.b.c.d形式的IP转换为32位的IP存储在inp指针里。

    inet_ntoa函数是将32位的IP地址转换位a.b.c.d的格式。

    字节序转换

    htons函数:把unsigned short类型从主机序转换到网络序

    htonl函数:把 unsigned long类型的从主机序转换到网络序

    ntohs函数:把unsigned short类型从主机序转换到网络序

    ntols函数:把unsigned long类型从主机序转换到网络序

    IP与主机名

    struct hostent *gethostbyname(const char *hostname); //获得主机名的函数,其返回值是一个名hostent的结构体

     struct hostent的结构如下:

    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地址

    socket编程函数

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

    创建一个socket,返回值:非负数-----创建成功,-1-------创建失败 

    family:协议簇

    type:套接字的类型:是流式套接字?数据报套接字还是原始套接字?

    protocol: 套接口所用的协议。如调用者不想指定,可用 0

    其返回值:调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。 

    2. int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);  

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

      socket:是一个套接字。
    address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。

    address_len:确定缓冲区的长度。

    其返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。 

    3. int connect (int sockfd,struct sockaddr * serv_addr,int addrlen); 

    该函数用于与服务器建立连接 

    sockfd:套接字描述符

    serv_addr:指向数据机构sockaddr的指针,其中包括目的端口和IP地址 

    addrlen:参数二sockaddr的长度。(可以通过sizeof(struct sockaddr)获得 )

    其返回值:成功则返回0,失败返回-1。

    4.  int listen(int sockfd, int backlog);

       listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。   

        listen函数在一般在调用bind之后-调用accept之前调用。

          sockfd:套接字描述符

    backlog:连接请求队列(queue of pending connections)的最大长度(一般由2到4)。用SOMAXCONN则由系统确定。

    其返回值:无错误,返回0, 否则,返回SOCKET ERROR,可以调用函数WSAGetLastError取得错误代码。

    5. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 

    该函数用来等待来自客户端的socket连接请求。

    sockfd:套接字描述符 

      addr:指向结构体sockaddr的指针。

    addrlen: addr参数指向的内存空间的长度。

    其返回值:成功返回新套接字描述符;失败返回错误信息 。 

    6. size_t send ( int s , const void *msg , size_t len , int flags);

    该函数用来发送数据

    s:发送端套接字描述符; 

    msg:一个存放应用程式要发送数据的缓冲区;

    len:实际要发送的字节数;

    flags:一般为0

    其返回值:成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。 

    7.  int  recv( int s, coid* msgbuf, size_t len, int flags); 

      该函数用于接收数据

    s:一个标识已连接套接口的描述字。

       msgbuf:用于接收数据的缓冲区
       len:缓冲区长度。

       flags:指定调用方式。

    以上纯属个人自学总结的知识,欢迎大神指正批评········ 

  • 相关阅读:
    docker设置国内镜像
    asp.net core 构建docker镜像
    asp.net POST 数据
    asp.net core 增加浏览器缓存设置
    .net fx源码
    新项目升级到JFinal3.5之后的改变-着重体验自动依赖注入
    微信小程序教程汇总
    如何注册微信小程序
    JFinal-美女图爬虫-一个不正经的爬虫代码
    投资20万研发的JFinal项目《旅游线路营销管理系统》准备公开课中
  • 原文地址:https://www.cnblogs.com/scrat/p/2591853.html
Copyright © 2020-2023  润新知