如何在Linux上搭建TCP服务器 (linux上tcp服务器)
TCP服务器是网络编程中常见的一个部分。当我们需要在Linux系统中搭建TCP服务器时,应该如何去做呢?本文将从以下几个方面介绍。
1. 确定端口号
TCP服务器的端口号是服务器运行时的唯一标识。因此,在搭建TCP服务器之前,我们需要选择一个未被其他程序占用的端口号。常见的端口号范围是1024~65535,其中1024~49151是注册端口,49152~65535是动态端口。在选择端口号时,我们可以参考这个范围,选择一个未被占用的端口号即可。
可以通过以下命令查看当前系统中已经被占用的端口号:
“`
$ netstat -ano | grep LISTEN
“`
2. 创建服务器程序
在Linux系统中,可以使用C语言、Java、Python等多种语言来编写TCP服务器程序。这里我们以C语言为例,介绍如何创建一个TCP服务器程序。
(1)包含必要的头文件
在创建C语言程序时,之一步通常是包含必要的头文件。对于TCP服务器程序,我们需要包含以下头文件:
“`
#include
#include
#include
#include
#include
#include
#include
“`
(2)创建套接字
TCP服务器程序需要创建一个套接字(Socket)。Socket是两个进程之间通信的一种方式,它包括一个IP地址和一个端口号。在C语言中,可以使用以下函数来创建套接字:
“`
int socket(int domn, int type, int protocol);
“`
这个函数的参数含义如下:
– domn:地址族,比如AF_INET表示IPv4地址族;
– type:套接字类型,比如SOCK_STREAM表示面向连接的流式套接字;
– protocol:协议,比如IPPROTO_TCP表示TCP协议。
创建套接字后,我们可以使用以下函数来获取套接字的文件描述符(File Descriptor):
“`
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
“`
这里我们使用IPv4地址族,面向连接的流式套接字,使用TCP协议。
(3)绑定地址
创建好套接字后,我们需要将套接字绑定到一个IP地址和端口号上,这样才能接收客户端的连接请求。在C语言中,可以使用以下函数来绑定套接字:
“`
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
“`
这个函数的参数含义如下:
– sockfd:套接字文件描述符;
– addr:指向一个sockaddr结构体的指针,包括IP地址和端口号等信息;
– addrlen:指定addr结构体的长度。
以下是一个示例代码:
“`
struct sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 8080;
/* 设置套接字地址信息 */
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
/* 绑定套接字 */
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
error(“ERROR on binding”);
“`
这里我们将套接字绑定到IP地址INADDR_ANY上,端口号为8080。
(4)监听连接
套接字绑定好之后,我们需要对套接字进行监听,以准备接收客户端的连接请求。在C语言中,可以使用以下函数来监听套接字:
“`
int listen(int sockfd, int backlog);
“`
这个函数的参数含义如下:
– sockfd:套接字文件描述符;
– backlog:更大连接数。
以下是一个示例代码:
“`
listen(sockfd, 5);
“`
这里我们将更大连接数设置为5。
(5)接收连接
当客户端向服务器发起连接请求时,服务器会通过accept函数来接收这个连接请求。在C语言中,可以使用以下函数来接收连接请求:
“`
int newsockfd = accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
“`
这个函数的参数含义如下:
– sockfd:套接字文件描述符;
– addr:指向一个sockaddr结构体的指针,包括IP地址和端口号等信息;
– addrlen:指定addr结构体的长度。
新创建的套接字newsockfd将用于与客户端进行通信。
以下是一个示例代码:
“`
socklen_t clilen;
struct sockaddr_in cli_addr;
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd
error(“ERROR on accept”);
“`
(6)发送和接收数据
通过accept函数创建新的套接字后,我们就可以开始与客户端进行数据通信了。在C语言中,可以使用以下函数来发送和接收数据:
“`
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
“`
这两个函数的参数含义如下:
– sockfd:套接字文件描述符;
– buf:指向要发送/接收的数据的指针;
– len:要发送/接收的数据的长度;
– flags:发送/接收数据的标志位。
以下是一个示例代码:
“`
int n;
char buffer[256];
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n
error(“ERROR reading from socket”);
printf(“Here is the message: %s\n”,buffer);
n = write(newsockfd,”I got your message”,18);
if (n
error(“ERROR writing to socket”);
“`
这里我们先使用read函数从新套接字中读取客户端发送的数据,再使用write函数向客户端发送响应数据。
3. 编译和运行服务器程序
完成代码编写之后,我们需要将程序编译成可执行文件,然后运行服务器程序,开始监听连接。在Linux系统中,可以使用以下命令来将C语言程序编译成可执行文件:
“`
$ gcc server.c -o server
“`
这里我们将server.c编译成名为server的可执行文件。
编译完成后,我们就可以运行服务器程序了:
“`
$ ./server
“`