• linux下的socket编程(3)--server端的简单示例


    linux下的socket编程(3)

    server端的简单示例:

    经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上去。

    绑定socket到一个端口上去

     

    bind()函数可以将socket绑定一个端口上,client可以通过这个端口发起请求,端口对应的socket便会与client端的socket连接。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include<stdio.h>
    #include<stdllib.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #Include<arpa/inet.h>
     
    int main()
    {
    int socket_desc;
    struct sockaddr_in server;
     
    socket_desc = socket(AF_INET,SOCK_STREAM,0);
    if(-1==socket_desc)
    {
    perror("socket create error ");
    exit(1);
    }
     
    //监听服务器自身
     
    server.sin_family=AF_INET;
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = INADDR_ANY;
     
    //绑定到端口
     
    if(bind(socket_desc,(struct sockaddr* )&server,sizeof(server))<0)
    {
    perror("bind failed ");
    exit(1);
    }
    printf("bind success ");
    close(socket_desc);
    return 0;
    }

    对于socket绑定到一个明确的端口上,我们接下来要做的就是接受这个端口下面的所有数据。。

    通过上面的实现,我们可以看出一个端口只能被一个socket使用。

    监听端口:

     

    在绑定完成socket与端口之后,我们还需要去监听端口。为此,我们需要将socket设置在被监听的状态。listen()将被用来将socket设置为被监听的模式下。

    listen( socket_desc, 3);

    listen(int sockfd,int backlog);可以将socket处于监听的状态下

    接收请求建立连接:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/socket.h>
    #include<arpa/inet.h>
     
    int main()
    {
    int sock_desc,new_socket,sockaddr_size;
    struct sockaddr_in server,client;
     
    //创建socket
    sock_desc = socket(AF_INET,SOCK_STREAM,0);
    if(-1==sock_desc)
    {
    perror("cannot create socket ");
    exit(1);
    }
     
    server.sin_family = AF_INET;
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = INADDR_ANY;
     
    //绑定
     
    if(bind(sock_desc,(struct sockaddr*)&server,sizeof(server))<))
    {
    perror("bind error ");
    exit(1);
    }
     
    //监听
     
    listen(sock_desc,5);
     
    puts("waiting for incoming connecting ");
     
    //接受链接
     
    sockadddr_size = sizeof(sruct sockaddr_in );
    new_socket = accept(sock_desc,(struct sockaddr *)&client,(socklen_t * )&sockaddr_size);
    if(new_socket<0)
    {
    perror("accept failed");
    exit(1);
    }
    puts("connecting accept ");
    //先关闭socket_desc 产生的new_socket
    close(new_socket);
    //z在关闭sock_desc
    close(sock_desc);
    return 0;
    }

    运行上述代码:输出:waiting for incoming connecions.

    现在代码已经正常跑起来了,并且等待请求连接。在另外一个终端内,我们发起一个请求:

    teltnet 127.0.0.1 8888

    在当前这个终端内将会输出:

    trying 127.0.0.1

    connected to loaclhost。

    Escape character is ;;

    connection closed by foreign host

    同时在之前的终端中,server会输出:

    waiting for incoming connecions.

    connection accepted

    便可以看到,server已经正确接收了client的连接请求并建立了连接,只是没有了后续操作,主机紧接着关闭了这个链接。

    连接建立之后便可以顺利地进行双方的通信,这部分的send与recv操作完全一样。

    另外, 服务端获取客户端的ip地址:

    由前面能够知道accept()返回的是结构体sockaddr_in ,由此很容易得知client的ip和端口信息。

    1
    2
    char * client_ip = inet_ntoa(client.sin_addr);
    int client_port = ntohs(client.sin_port);
  • 相关阅读:
    Nginx源码编译安装
    nginx版本对比
    k8s中subpath挂载单个文件报错处理
    C++ array 数组函数
    洛谷 P2141
    c++ set容器
    字符串中输出每一个元素的方法
    string中的pop_back()函数
    如何去掉前导0 在字符串中 算法
    pat 乙级1074
  • 原文地址:https://www.cnblogs.com/yjds/p/8597340.html
Copyright © 2020-2023  润新知