📅  最后修改于: 2023-12-03 15:30:16.237000             🧑  作者: Mango
本篇介绍如何在C语言中实现TCP协议的Server-Client模型。TCP是一种面向连接、可靠的传输协议,常用于网络通信中。Server-Client模型指的是一个服务端(Server)和多个客户端(Client)之间建立连接,进行数据交换的过程。
在C语言中,通过socket函数来创建一个socket。socket函数的原型如下:
int socket(int domain, int type, int protocol);
其中,domain参数指定协议族,type参数指定socket类型,protocol参数指定具体协议。对于TCP协议,domain应为AF_INET,type应为SOCK_STREAM,protocol应为IPPROTO_TCP。代码如下:
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int server_port = 8888;
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
通过bind函数将socket与特定的IP地址和端口绑定。代码如下:
server_address.sin_family = AF_INET;
server_address.sin_port = htons(server_port);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
通过listen函数监听socket,等待客户端连接。代码如下:
listen(server_socket, 5);
通过accept函数接受客户端连接,并返回与客户端通信的socket。代码如下:
socklen_t client_address_len = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_len);
通过recv和send函数来接收和发送数据。代码如下:
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
printf("Received %d bytes: %s\n", bytes_received, buffer);
int bytes_sent = send(client_socket, buffer, bytes_received, 0);
printf("Sent %d bytes: %s\n", bytes_sent, buffer);
通过close函数关闭socket。代码如下:
close(client_socket);
close(server_socket);
Server端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int server_port = 8888;
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server_address.sin_family = AF_INET;
server_address.sin_port = htons(server_port);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
listen(server_socket, 5);
printf("Waiting for client connections...\n");
socklen_t client_address_len = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr*) &client_address, &client_address_len);
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
printf("Received %d bytes: %s\n", bytes_received, buffer);
int bytes_sent = send(client_socket, buffer, bytes_received, 0);
printf("Sent %d bytes: %s\n", bytes_sent, buffer);
close(client_socket);
close(server_socket);
return 0;
}
Client端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int client_socket;
struct sockaddr_in server_address;
char* server_ip = "127.0.0.1";
int server_port = 8888;
client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server_address.sin_family = AF_INET;
server_address.sin_port = htons(server_port);
server_address.sin_addr.s_addr = inet_addr(server_ip);
connect(client_socket, (struct sockaddr*) &server_address, sizeof(server_address));
char* message = "Hello, Server!";
int message_size = strlen(message);
int bytes_sent = send(client_socket, message, message_size, 0);
printf("Sent %d bytes: %s\n", bytes_sent, message);
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);
printf("Received %d bytes: %s\n", bytes_received, buffer);
close(client_socket);
return 0;
}
本篇介绍了如何使用C语言实现TCP协议的Server-Client模型。通过socket、bind、listen、accept、recv和send等函数,可以轻松地实现基本的网络通信功能。当然,在实际应用中,可能还需要考虑连接管理、消息协议、数据加密等方面的问题。