教你如何编写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;

}

四、


数据运维技术 » 教你如何编写TCP协议的客户端/服务器程序。 (tcp 服务器客户端程序)