教你如何编写TCP协议的客户端/服务器程序。 (tcp 服务器客户端程序)
教你如何编写TCP协议的客户端/服务器程序
TCP协议是网络编程中较为常见的协议之一,客户端/服务器程序也是开发中经常需要涉及到的应用场景。在本文中,将会详细介绍如何编写TCP协议的客户端/服务器程序,让读者能够掌握TCP协议的基本原理,以及如何使用C语言实现客户端/服务器程序。
一、TCP协议简介
TCP(Tranission Control Protocol,传输控制协议)是一个可靠的、面向连接的、基于流的传输层通信协议。它是IP协议族中的一员,主要用于互联网中数据的传输。TCP协议通过三次握手建立连接,可以提供完整的数据传输保证,同时也支持流量控制和拥塞控制,使得数据传输更加可靠和高效。
二、客户端/服务器程序设计
客户端/服务器程序是指一种系统架构,该架构中客户端与服务器之间通过网络通信来完成数据交互。在TCP协议中,客户端和服务器之间需要建立连接,才能进行通信。我们可以将服务器端理解为提供服务的主机,而客户端则是请求服务的主机。
在进行客户端/服务器程序设计时,我们需要了解请求方和响应方之间的通信流程。客户端向服务器发起连接请求,服务器收到请求后应做出响应,双方建立连接;之后,客户端向服务器发送请求,服务器接收到请求后进行相关处理,并返回处理结果给客户端。通信结束后,双方需要关闭连接。
三、实现TCP协议的客户端/服务器程序
在C语言中,我们可以使用socket和select函数来实现TCP协议的客户端/服务器程序。
1. 服务器端程序实现
服务器端程序需要完成以下几个步骤:
1)创建socket:使用socket函数创建套接字,该函数返回套接字文件描述符。
int socket(int domn, int type, int protocol);
2)绑定端口:使用bind函数将套接字绑定到一个端口上。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3)监听连接请求:使用listen函数监听连接请求。
int listen(int sockfd, int backlog);
4)接收连接请求:使用accept函数接收客户端的连接请求,并返回套接字文件描述符。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
5)数据交互:通过读写套接字实现与客户端之间的数据交互。
示例代码如下:
#include
#include
#include
#include
#include
#include
#include
const int MAXLINE = 4096;
const int PORT = 9999;
const int MAXCONN = 100;
int mn() {
//1. 创建socket
int listenfd, connfd;
struct sockaddr_in servaddr, clientaddr;
char buff[MAXLINE];
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1) {
perror(“socket error”);
exit(1);
}
printf(“socket ok\n”);
//2. 绑定端口
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror(“bind error”);
exit(1);
}
printf(“bind ok\n”);
//3. 监听连接请求
if (listen(listenfd, MAXCONN) == -1) {
perror(“listen error”);
exit(1);
}
printf(“listen ok\n”);
//4. 接收连接请求
while (1) {
socklen_t clilen = sizeof(clientaddr);
connfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clilen);
if (connfd == -1) {
perror(“accept error”);
exit(1);
}
printf(“accept ok\n”);
//5. 数据交互
int n;
while ((n = read(connfd, buff, MAXLINE)) > 0) {
buff[n] = ‘\0’;
printf(“recv: %s”, buff);
write(connfd, buff, strlen(buff)+1);
}
//6. 关闭连接
close(connfd);
printf(“close ok\n”);
}
return 0;
}
2. 客户端程序实现
客户端程序需要完成以下几个步骤:
1)创建socket:使用socket函数创建套接字,该函数返回套接字文件描述符。
int socket(int domn, int type, int protocol);
2)连接服务器:使用connect函数连接指定的服务器。
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
3)数据交互:通过读写套接字实现与服务器之间的数据交互。
4)关闭连接:使用close函数关闭连接。
示例代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
const int MAXLINE = 4096;
const int PORT = 9999;
int mn(int argc, char **argv) {
if (argc != 2) {
printf(“usage: ./client \n”);
}
//1. 创建socket
int sockfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror(“socket error”);
exit(1);
}
printf(“socket ok\n”);
//2. 连接服务器
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) == -1) {
perror(“inet_pton error”);
exit(1);
}
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror(“connect error”);
exit(1);
}
printf(“connect ok\n”);
//3. 数据交互
int n;
while (fgets(buff, MAXLINE, stdin) != NULL) {
if (write(sockfd, buff, strlen(buff)+1) == -1) {
perror(“write error”);
exit(1);
}
if ((n = read(sockfd, buff, MAXLINE)) > 0) {
buff[n] = ‘\0’;
printf(“recv: %s”, buff);
}
}
//4. 关闭连接
close(sockfd);
printf(“close ok\n”);
return 0;
}
四、