目 录CONTENT

文章目录
TCP

tcp协议c语言实现

不争
2025-02-04 / 0 评论 / 0 点赞 / 27 阅读 / 4570 字

tcp协议c语言实现

服务端

// TCP 服务端程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
​
#define BUFFER_SIZE 1024
#define SERVER_PORT 11121
​
void extract_name(char* buffer) {
  unsigned long len = strlen(buffer);
  int i = (int) len - 1;
  for (; i >= 0 ; i --) {
    if (buffer[i] == ' ') {
      break;
    }
  }
  for (int j = 0; j < len - i ; j ++) {
    buffer[j] = buffer[i + j + 1];
  }
  char temp[64];
  strcpy(temp, buffer);
  strcpy(buffer, "Hello, ");
  strcpy(buffer, temp);
  strcat(buffer, ", nice to meet you.");
}
int main() {
  int server_sockfd;
  int client_sockfd;
  long recv_len;
  struct sockaddr_in server_addr;
  struct sockaddr_in client_addr;
  socklen_t sin_size = sizeof(struct sockaddr_in);
  char buffer[BUFFER_SIZE];
  memset(&server_addr, 0, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = INADDR_ANY;
  server_addr.sin_port = htons(SERVER_PORT);
  // 创建socket
  if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    printf("Failed to create socket.\n");
    return -1;
  }
  // 绑定地址
  if (bind(server_sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in))< 0) {
    printf("Failed to bin socket.\n");
    return -1;
  }
  // 绑定端口
  if (listen(server_sockfd, 5) < 0) {
    printf("Failed, to listen socket\n");
  }
​
  // 打印服务端的 IP 地址和端口号
  char server_ip[INET_ADDRSTRLEN];
  inet_ntop(AF_INET, &server_addr.sin_addr, server_ip, sizeof(server_ip));
  int server_port = ntohs(server_addr.sin_port);
​
  printf("start server success!\n");
  printf("Server is running on %s:%d\n", server_ip, server_port);
​
  // 监听端口
  while(1) {
    client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &sin_size);
    while((recv_len = recv(client_sockfd, buffer, BUFFER_SIZE, 0)) > 0) {
      buffer[recv_len] = 0;
      printf("Recieve message from client: %s\n", buffer);
      extract_name(buffer);
      char temp[BUFFER_SIZE] = "Hello, ";
      strcat(temp, buffer);
      send(client_sockfd, temp, strlen(temp), 0);
    }
  }
  return 0;
}

客户端

// TCP 客户端程序
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <unistd.h> 
​
#define BUFFER_SIZE 1024
#define SERVER_PORT 11121
​
int main() {
  int client_sockfd;
  long recv_len;
  struct sockaddr_in server_addr;
  char buffer[BUFFER_SIZE];
  
  memset(&server_addr, 0, sizeof(server_addr));
  memset(&buffer, 0, sizeof(buffer));
  
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = inet_addr("75.178.213.88");
  server_addr.sin_port = htons(SERVER_PORT);
  // 创建socket
  if ((client_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    printf("Failed to creare socket.\n");
    return -1;
  }
  // 请求tcp服务器
  if (connect(client_sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) < 0) {
    printf("Failed to connect remote socket.\n");
    return -1;
  }
  // 向服务器发送消息
  strcpy(buffer, "Hello Server, I'm Gz");
  send(client_sockfd, buffer, strlen(buffer), 0);
  // 接收返回的消息
  recv_len = recv(client_sockfd, buffer, BUFFER_SIZE, 0);
  buffer[recv_len] = 0;
  printf("Recieve message from server: %s\n", buffer);
​
  close(client_sockfd);
}

验证

一边是公网的服务器,一边是本地树莓派,验证ok。


0

评论区