硬件条件
当然你要先有一个云服务器,腾讯云比阿里云便宜一点,所以就用腾讯云了

问了师兄买这个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




















