1:大概模型:
客户端(tcp)------->nginx(10.30.32.224:10087)------->上游服务程序1(10.30.32.224:10020)
|
------->上游服务程序2(10.30.32.224:10021)
2:借助nginx的高并发和负载均衡特性,将客户端的请求经过nginx分发给上游服务器处理,分发方式有:轮训、按权重、hash。
3:安装nginx-1.14.2,进入nginx-1.14.2目录
执行: ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream
然后 make & make install
4:修改nginx配置文件(轮训分发)
vim /usr/local/nginx/conf/nginx.conf
添加
启动nginx:/usr/local/nginx/sbin/nginx
5:启动上游服务程序1,上游服务程序2
6:客户端发送请求
7:两个上游服务程序都接收到了客户端的请求。
8:上游服务程序1代码(上游服务程序2代码相似,改端口即可)
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
int main(){
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == -1){
cout << "create socket error! " << endl;
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(10020);
if(bind(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr)) == -1){
cout << "bind socket error! " << endl;
return -1;
}
if(listen(sock, 512) == -1){
cout << "listen socket error! " << endl;
return -1;
}
struct sockaddr_in cli_sin;
socklen_t cli_sin_len = sizeof(struct sockaddr);
while(1){
cout << "waitting client connect..." << endl;
int cli_sock = accept(sock, (struct sockaddr*)&cli_sin, &cli_sin_len);
if(cli_sock == -1){
cout << "accept socket error! " << endl;
return -1;
}
int real_read=0;
int want_read=1024;
char buf[1024]="";
real_read = recv(cli_sock, buf, want_read, 0);
if(real_read < 0){
cout << "recv socket error! " << endl;
return -1;
}else if(real_read = 0){
cout << "connection closed! " << endl;
return -1;
}else{
cout << buf << endl;
}
char send_buf[1024] = "server1 have received";
int real_send;
real_send = send(cli_sock, send_buf, sizeof(send_buf), 0);
cout << "real_send=" << real_send << endl;
}
return 0;
}
编译:g++ -o server_test server_test.cpp
9:客户端代码
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
int main(){
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == -1){
cout << "create socket error! " << endl;
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("10.30.32.224");
sin.sin_port = htons(10087);
if(connect(sock, (struct sockaddr*)&sin, sizeof(struct sockaddr)) == -1){
cout << "connect server error!" << endl;
return -1;
}
char send_buf[1024] = "hello world!";
int real_send;
real_send = send(sock, send_buf, sizeof(send_buf), 0);
cout << "real_send=" << real_send << endl;
int real_read=0;
int want_read=1024;
char buf[1024]="";
real_read = recv(sock, buf, want_read, 0);
if(real_read < 0){
cout << "recv socket error! " << endl;
return -1;
}else if(real_read = 0){
cout << "connection closed! " << endl;
return -1;
}else{
cout << buf << endl;
}
return 0;
}
编译:g++ -o client_test client_test.cpp