0%

cpp实现云服务器与本地主机socket通信

原文链接:cpp实现云服务器与本地主机socket通信

云服务器与本地主机socket通信

介绍

云服务器本身拥有全时间段在线的能力,可以支撑我们大部分web项目的运行需求。
但是当服务器算力不够或者是数据存在安全性问题时,我们不希望将所有任务都放置在服务器中运行,
而是会选择本地的终端提供数据或者算力服务,以达到加速或保密的需求。
实现这种需求就需要本地主机与服务器进行socket通信。

服务器

服务器端建立一个server.cpp文件,使用linux socket系统调用创建socket,设置ip和端口,
使用bind和listen绑定监听,再调用accept处理连接请求。

  • 注意服务器要开放对应的端口规则,否则无法访问
  • 同时服务器端的监听ip应该为0.0.0.0 表示允许任意ip与服务器连接,在本地运行时我们设置127.0.0.1时能连接的原因是client和server都是本地IP

客户端

客户端较为简单,指定IP为服务器公网IP,指定端口号,调用connect连接,互相发送问候消息验证。

appendix

server.cpp

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"sys/ipc.h"
#include"sys/msg.h"
#include"iostream"
#include"unistd.h"
#include"string.h"
#include"sys/types.h"
#include"sys/shm.h"
#include"sys/socket.h"
#include"arpa/inet.h"
#include"signal.h"

int fd;
void cl(int p){
close(fd);
printf("terminated\n");
exit(-1);
}

int main(){

int socketfd;
socketfd=socket(AF_INET,SOCK_STREAM,0);

fd=socketfd;
signal(SIGINT,cl);

sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
inet_pton(AF_INET,"0.0.0.0",&(server_addr.sin_addr));
server_addr.sin_port=htons(9000);
bind(socketfd,(sockaddr*)(&server_addr),sizeof(server_addr));

listen(socketfd,10);

sockaddr_in client_addr;
int conntfd;
char client_ip[16];
int client_port=0;
char msg[100];
socklen_t client_len=sizeof(client_addr);
while(1){
printf("listen...\n");
conntfd=accept(socketfd,(sockaddr*)(&client_addr),&client_len);
inet_ntop(AF_INET,&client_addr.sin_addr,client_ip,16);
client_port=ntohs(client_addr.sin_port);
printf("accept %s:%d\n",client_ip,client_port);
memcpy(msg,"hello!",sizeof("hello!"));
send(conntfd,msg,100,0);
recv(conntfd,msg,sizeof(msg),0);
printf("client:%s\n",msg);
}


return 0;
}





client.cpp

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
#include"sys/ipc.h"
#include"sys/msg.h"
#include"iostream"
#include"unistd.h"
#include"string.h"
#include"sys/types.h"
#include"sys/shm.h"
#include"sys/socket.h"
#include"arpa/inet.h"


int main(){


int socketfd;
socketfd=socket(AF_INET,SOCK_STREAM,0);



struct timeval tv;
tv.tv_sec=0;
tv.tv_usec=0;
setsockopt(socketfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));



sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
inet_pton(AF_INET,"47.102.99.208",&(server_addr.sin_addr));
server_addr.sin_port=htons(9000);
int c=0;
while(connect(socketfd,(sockaddr*)(&server_addr),sizeof(server_addr))==-1)
{
sleep(1);
printf("reconnect %d\n",++c);
}
printf("connect success!\n");
char msg[100];
recv(socketfd,msg,sizeof(msg),0);
printf("server:%s\n",msg);
memcpy(msg,"hi!",sizeof("hi!"));
if( send(socketfd,msg,100,0)<0){
perror("send");
}
close(socketfd);
return 0;
}