监听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 '^]'.
这样就表示连接上咯