Linux主机连接腾讯云服务器详细配置
硬件条件
当然你要先有一个云服务器,腾讯云比阿里云便宜一点,所以就用腾讯云了
问了师兄买这个98的就行,选择CentOS,不要选Ubuntu,因为
嗯,大概就是这样
编程测试
云服务器当然是作为服务端
server.cpp
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(int argc, char *argv[])
{if (argc != 2){printf("Using:./server port\nExample:./server 5005\n\n");return -1;}int listenfd;if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(atoi(argv[1]));if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0){perror("bind");close(listenfd);return -1;}if (listen(listenfd, 5) != 0){perror("listen");close(listenfd);return -1;}int clientfd;int socklen = sizeof(struct sockaddr_in);struct sockaddr_in clientaddr;clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, (socklen_t *)&socklen);printf("客户端%s已连接\n", inet_ntoa(clientaddr.sin_addr));char buffer[1024];while (true){int iret;memset(buffer, 0, sizeof(buffer));if ((iret = recv(clientfd, buffer, sizeof(buffer), 0)) <= 0){printf("iret=%d\n", iret);break;}printf("receive text:%s\n", buffer);strcpy(buffer, "ok");if ((iret = send(clientfd, buffer, strlen(buffer), 0)) <= 0){perror("send");break;}printf("send text:%s\n", buffer);}close(listenfd);close(clientfd);
}
在自己的Linux上写客户端代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int main(int argc, char *argv[])
{if (argc != 3){printf("Using:./client ip port\nExample:./client 127.0.0.1 5005\n\n");return -1;}int sockfd;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");return -1;}struct hostent *h;if ((h = gethostbyname(argv[1])) == 0){printf("gethostbyname failed.\n");close(sockfd);return -1;}struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));memcpy(&servaddr.sin_addr, h->h_addr, h->h_length);if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0){perror("connect");close(sockfd);return -1;}char buffer[1024];for (int i = 0; i < 3; i++){int iret;memset(buffer, 0, sizeof(buffer));sprintf(buffer, "I am Monster number %d",i + 1);if ((iret = send(sockfd, buffer, strlen(buffer), 0)) <= 0){perror("send");break;}printf("send text:%s\n", buffer);memset(buffer, 0, sizeof(buffer));if ((iret = recv(sockfd, buffer, sizeof(buffer), 0)) <= 0) {printf("iret=%d\n", iret);break;}printf("receive text:%s\n", buffer);}close(sockfd);
}
云服务器配置
要在防火墙这里自定义出用于通信的端口
测试
在云服务器运行服务程序
[lighthouse@VM-4-11-centos bin]$ ./server 6666
客户端114.213.236.99已连接
receive text:I am Monster number 1
send text:ok
receive text:I am Monster number 2
send text:ok
receive text:I am Monster number 3
send text:ok
iret=0
在Linux运行客户程序
redwall@redwall-G3-3500:~/Test/socket_test/bin$ ./client 1.116.137.21 6666
send text:I am Monster number 1
receive text:ok
send text:I am Monster number 2
receive text:ok
send text:I am Monster number 3
receive text:ok
注意客户端连接的是服务端的公网IP