实现一个基于TCP的最小服务器程序
- 在本机8080端口启动一个tcp服务器
- 等待客户端连接
- 接受一个客户端后向其发送一条字符串消息,然后关闭连接并退出程序
为了实现这套流程,我们需要以下步骤
- 创建socket,申请网络通信资源(这里的是监听socket_fd)
- 准备服务器地质结构(IP+端口)
- bind绑定socket和地址(占用端口)
- 进入监听状态等待客户端,为这个客户端创建一个专属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 53 54 55 56 57 58 59 60
| #include<iostream> #include<cstring> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> using namespace std;
int main(){ int server_fd=socket(AF_INET,SOCK_STREAM,0); if(server_fd==-1){ cerr<<"Socket create failed"<<endl; return -1; } sockaddr_in address; address.sin_family=AF_INET; address.sin_addr.s_addr=INADDR_ANY; address.sin_port=htons(8080);
if(bind(server_fd,(struct sockaddr*)&address,sizeof(address))<0){ return -1; } if(listen(server_fd,3)<0){ return -1; } cout<<"Listening on port 8080...(Press Ctrl+C to stop)"<<endl;
int new_socket; int addrlen=sizeof(address); new_socket=accept(server_fd,(struct sockaddr*)&address,(socklen_t*)&addrlen); if(new_socket<0){ cerr<<"Accept failed"<<endl; return -1; } cout<<"Connection accepted"<<endl;
const char* hello="Hello from server"; send(new_socket,hello,strlen(hello),0); cout<<"Response sent."<<endl;
close(new_socket); close(server_fd); }
|
该代码展示了 TCP 服务器从创建、监听、接受连接到通信和关闭的完整流程,是理解 C++ 网络编程和操作系统网络接口的最小可运行示例。
多线程并发服务器
在刚刚的代码中我们可以发现一个显著问题,