用C++写一个简单的服务器(Linux)
下面是创建一个简单服务器的基本流程,所用的端口是8099。后面贴了代码。
一、基本流程:
- 创建套接字
- 配置服务器地址相关参数
- 将两者绑定
- 监听套接字上的端口
- 在上面创建的套接字上等待连接,并打开一个新的套接字用于与请求之间的交互
- 在发送缓冲区中写入响应
- 关闭连接
- 创建套接字
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0){
std::cout << "create socketfd failed" <<std::endl;
return 0;
}
函数socket()
所在的头文件为 sys/socket.h
,声明为
extern int socket (int __domain, int __type, int __protocol) __THROW;
- 配置服务器地址相关参数
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
变量servaddr
的类型为struct sockaddr_in
,它所在的头文件为 netinet/in.h
。
- 将上面两者绑定
int bind_ok = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(bind_ok < 0){
std::cout << "bind socket with server address failed" <<std::endl;
return 0;
}
函数bind()
所在的头文件为 sys/socket.h
,声明为
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) __THROW;
- 监听套接字上的端口
int listen_ok = listen(listenfd, LISTENQ);
if(listen_ok < 0){
std::cout << "listen socket failed" <<std::endl;
return 0;
}
函数listen()
所在的头文件为 sys/socket.h
,声明为
extern int listen (int __fd, int __n) __THROW;
- 在上面创建的套接字上等待连接,并打开一个新的套接字用于与请求之间的交互
connfd = accept(listenfd, NULL, NULL);
if(connfd < 0){
std::cout << "create connection socket failed" <<std::endl;
return 0;
}
函数accept()
所在的头文件为 sys/socket.h
,声明为
extern int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len);
- 在发送缓冲区中写入响应
write_ok = write(connfd, buffer.c_str(), strlen(buffer.c_str()));
if(write_ok < 0){
std::cout << "write info to connection socket failed" <<std::endl;
close(connfd);
return 0;
}
函数 write()
所在的头文件为unistd.h
,声明为
extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;
函数close()
所在的头文件为 unistd.h
,声明为
extern int close (int __fd);
- 关闭连接
close(connfd);
二、编译、运行、验证
$
$ g++ simple_server.cpp -o run_this
$
$ ./run_this
$
$ curl http://localhost:8099
$
hello, this is a simple server.
$
hello, this is a simple server.
length of it: 32
三、代码
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#define PORT 8099
#define LISTENQ 5
int main(){
int listenfd, connfd;
struct sockaddr_in servaddr;
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0){
std::cout << "create socketfd failed" <<std::endl;
return 0;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
int bind_ok = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(bind_ok < 0){
std::cout << "bind socket with server address failed" <<std::endl;
return 0;
}
int listen_ok = listen(listenfd, LISTENQ);
if(listen_ok < 0){
std::cout << "listen socket failed" <<std::endl;
return 0;
}
std::string buffer = "hello, this is a simple server.\n";
int write_ok;
while(1){
connfd = accept(listenfd, NULL, NULL);
if(connfd < 0){
std::cout << "create connection socket failed" <<std::endl;
return 0;
}
std::cout << buffer << std::endl << "length of it: " << buffer.size()<< std::endl;
write_ok = write(connfd, buffer.c_str(), strlen(buffer.c_str()));
if(write_ok < 0){
std::cout << "write info to connection socket failed" <<std::endl;
close(connfd);
return 0;
}
close(connfd);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)