如何在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

“`

相关问题拓展阅读:

Linux里面tcp协议属于四层服务吗?

TCP/IP 的分层管理

TCP/IP 协议按照层次分为 4 层:应用层、传输层、网络层、数据链路层。 对于分层这个概念,大家一定不陌生,比如我们的分布式架构体系中会分为业务层、服务层、基础支撑层。比模激如docker,也是基于分层来实现。所以我们会发现,复杂的程序都需要分层,这个是软件设计的要求,每一层专注于当前领域的事情。如果某些地方需要修改,我们只需要把变动的层替换掉就行,一方面改动影响较少,另一方面整个架构的灵活性也更高。 最后,在分层之后,整个架构的设计也变得相对简单了。

分层负载

了解了分层的概念以后,我们再去理解所谓的二层负载、三层负载、四层负载、七层负载就容易多了。

一次 http 请求过来,一定会从应用层到传输层,完成整个交互。只要是在网络上跑的数据包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

二层负载

二层负载是针对 MAC,负载均衡服务器对外依然提供一个 VIP(虚 IP),集群中不同的机器采用相同 IP 地址,但是机器的 MAC 地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标 MAC 地址的方式将请求转发到目标机器实现负载均衡

二层负载均衡会通过一个虚拟 MAC 地址接收请求,然后再分配到真实的 MAC 地址

三层负载均衡

三层负载是针对 IP,和二层负载均衡类似,负载均衡服务器对外依然提供一个 VIP(虚 IP),但是集群中不同的机器采用不同的 IP 地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过 IP 将请求转发至不同的真实服务器

三层负载均衡会通过一个虚拟 IP 地址接收请求,然后再分配到真实的 IP 地址

四层负载均衡

四层负载均衡工作在 OSI 模型的传输层,由于在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

四层通过虚拟 IP + 端口接收请求,然后再分配到真实的服务器

七层负载均衡

七旦裂袜层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 http、radius、dns 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web 服务器的源历负载均衡,除了根据 IP 加端口进行负载外,还可根据七层的 URL、浏览器类别来决定是否要进行负载均衡

比如:在nginx层做7层均衡,让一个uid的请求尽量落到同一个机器上

Linux里面tcp和tcp6区别是什么?

修改防火墙配置需要修改/etc/sysconfig/iptables这个文件,如果要开放哪个端口,在里面添加一条。-arh-firewall-1-input-mstate–statenew-mtcp-ptcp–dport1521-jaccept就可以了,其中1521是要开放的端口号,然后重新启动linux的防火墙服务。停止/启动防火墙服如册信务的命令:用root登录后,执行serviceiptablesstop–停止serviceiptablesstart–启动(service命令位于/in)防火墙规则只有在iptables服务运行的时候才能被激活。要手工启姿饥动服务,使用以下命令:/inrviceiptablesrestart要确保它在系统引导时渣轮启动,使用以下命令:/in/chkconfig–level345iptablesonipchains服务不能和iptables服务同时运行。要确定ipchains服务被禁用,执行以下命令:/in/chkconfig–level345ipchainsoff

指代不同

TCP:是一返胡举种面向连接的、可靠的、基于字节流的传输层

通信协议

TCP6:是

互联网工程任务组

设计的用于替代ipv4的下一代ip协议。

功能不同

TCP:适应支持多网络应用的分层协议层次结构,连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。

TCP6:ipv6具有更大的地址空间,ipv4中规定ip长度为32,更大地址个数为2^32,IPv6中ip地址的长度为128,即更大地址个数为2^128。与32位地址空间对比,其地址空间增加了2^128-2^32个。

特点做改不同

TCP:TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

TCP6:不仅能解决

网络地址

资源数漏碧量的问题,而且也解决了多种接入设备连入互联网的障碍。

修改防火墙配置需要修改/etc/sysconfig/iptables这个文件,如果要开放哪个端口,在里面添加一条。-arh-firewall-1-input-mstate–statenew-mtcp-ptcp–dport1521-jaccept就可以了,其中1521是要开放的端口号,然后重新启动linux的防火墙服务。停止/启动防火墙服如册信务的命令:用root登录后,执行serviceiptablesstop–停止serviceiptablesstart–启动(service命令位于/in)防火墙规则只有在iptables服务运行的时候才能被激活。要手工启姿饥动服务,使用以下命令:/inrviceiptablesrestart要确保它在系统引导时渣轮启动,使用以下命令:/in/chkconfig–level345iptablesonipchains服务不能和iptables服务同时运行。要确定ipchains服务被禁用,执行以下命令:/in/chkconfig–level345ipchainsoff

TCP/IP(TranissionControlProtocol/游兄InternetProtocol的简写,中文译名为传输控制协议/互联网络协议)。简单地说,就是由底神悄袭层的IP协议和TCP协议组运锋成的。

区别就是一个ipv4 一个是ipv6

希望可以帮助你 请采纳 谢谢

关于linux上tcp服务器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 如何在Linux上搭建TCP服务器 (linux上tcp服务器)