[socket] 刘傲天带你C++写socket之监听socket - 百年刘傲天

in 默认分类Ubuntusocket with 0 comment

监听socket信息

学习了创建,学习了绑定接口,那么肯定要有办法获取这个接口的信息

需要的头文件

#include <sys/socket.h>

函数原型

int listen(int sockfd, int backlog);

sockfd是需要被监听的socket的文本描述符
backlog指定最多连接数量,一个服务器端可以监听多个客户端,如果超过了backlog设置的数量,服务器则会拒绝连接

返回值

成功时返回0
失败时返回1并设置errno

综合学习信息写一个Demo

/*
* 根据所学的前三小节的知识写一个Demo
*/
#include <sys/socket.h>
#include <memory.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <cassert>
#include <libgen.h>
#include <iostream>
#include <signal.h>
#include <sys/types.h>

using namespace std;

//停止的信号
static bool stop = false;
static void handle_term(int sig){
    stop = true;
}
int main(int argc, char ** argv){
    //信号 回调 SIGTERM指定监听发送给本程序的终止请求信号
    signal(SIGTERM, handle_term);

    if (argc < 3){
        cout << "usage:" << basename(argv[0]) <<
            "ip_address port_number backlog" << endl;
        return 1;
    }
    const char * ip = argv[1];
    //将字符串转换为整形数
    int port = atoi(argv[2]);
    //指定最大连接数
    int backlog = atoi(argv[3]);

    //创建socket
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    //创建失败则断言
    assert(sockfd >= 0);

    //创建IPV4 socket地址
    struct sockaddr_in address;
    //将address的内存初始化
    memset(&address, 0, sizeof(address));

    address.sin_family = AF_INET;
    //将字符串IP地址转换后存储到address里
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int ret = bind(sockfd, (struct sockaddr *)&address, sizeof(address));
    assert(ret != -1);

    ret = listen(sockfd, backlog);
    assert(ret != -1);

    //等待连接
    while (!stop){
        //这里并没有写连接过程
        sleep(1);
    }

    //程序结束关掉socket
    close(sockfd);

    return 0;
}

这样一个基本的socket框架就完成咯

运行

$:g++ test_learn.cc
$:./a.out 0 9999 5

验证是否成功

$:./a.out 0 9999 5

再打开一个终端,不要停止./a.out的运行

$:telnet 0 9999
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

这样就表示连接上咯

Responses