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。
评论区