使用C语言实现服务器/客户端的TCP通信
Posted whowin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C语言实现服务器/客户端的TCP通信相关的知识,希望对你有一定的参考价值。
本文力求使用简单的描述说明一个服务器/客户端TCP通信的基本程序框架,文中给出了服务器端和客户端的实例源程序,本文的程序在ubuntu 20.04中编译运行成功,gcc版本号为:9.4.0
1. 前言
当两台主机间需要通信时,TCP和UDP是两种最常用的传输层协议,TCP是一种面向连接的传输协议,常用于对传输可靠性要求比较高的场合,比如传输文件;而UDP是一种无连接的通信方式,用于传输一些要求速度快,但对可靠性要求不高的场合,比如实时视频的传输;
所谓面向连接指的是在进行传输数据之前要确保进行通信的两台主机已经建立起了连接,比如A机和B机进行TCP通信,A发起通信时要首先连接B机,连接建立起来以后才能够进行数据传输(发送和接收数据),如果无法建立连接(比如B机没有开机)则不能进行数据传输;TCP协议有完善的错误检查和错误恢复的能力,能够保证数据完好无损地传输到目的地;
所谓面向无连接指的是在传输数据之前无须在两台进行通信的主机之间建立连接,直接发送数据即可,带来的问题是如果需要通信的两台主机如果其中有一台没有连接在网络上,那么发送的数据肯定是不能到达目的地的,同样,UDP协议没有完善的纠错机制,所以如果传输过程中出现错误,出错的数据包会被丢弃,导致数据没有到达目的地或者到达目的地的数据不完整;
相比较UDP通信,TCP通信对资源要求的要多一些,所以传输速
python编程系列---tcp服务端的简单实现
流程如下:
"""tcp服务端创建流程
1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求
2. 绑定端口
3. server_socket开启监听,由主动连接模式变为被动接受模式
4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信
5. 使用新创建的socket与客户端通信
6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信
7. server_socket关闭,则不再接收新的客户端请求
"""
代码如下:
1 from socket import * 2 3 4 def main(): 5 # 1.创建tcp_server_socket 套接字对象,用于监听客户端的请求 6 tcp_server_socket = socket(AF_INET,SOCK_STREAM) 7 8 # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口 9 """ 10 socket.setsockopt(level,option,value) :配置socket 11 level:等级,对哪个等级操作(ip,tcp,udp,socket等级) 12 option:设置哪个选项 13 socket.SO_REUSEADDR: 复用地址 14 value: True:表示复用,False,表示不复用 15 """ 16 tcp_server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,True) 17 # 提示:socket.setsockopt()方法要在 socket.bind()之前设置 18 19 # 2.绑定端口 20 tcp_server_socket.bind((\'\',9999)) 21 22 # 3. tcp_server_socket开始监听,有主动连接模式变为被动连接模式 23 tcp_server_socket.listen(5) 24 25 # 4.等待客户端的请求,一有连接,就创建一个与客户端对接的new_socket新套接字,并且用这个新关键字与客户端联系 26 while True: 27 new_socket,client_addr = tcp_server_socket.accept() 28 print("新客户端连接:" ,client_addr) 29 new_socket.send("欢迎使用".encode()) 30 31 # 5.使用新创建的new_socket来与客户端通信 32 # 此处的while True为同一客户端提供多次服务 33 while True: 34 recv_data = new_socket.recv(1024) 35 36 if recv_data: 37 print("新消息:%s,来自:%s"%(recv_data.decode(\'gbk\'),client_addr)) 38 39 # 给客户端返回消息 40 new_socket.send("再见".encode()) 41 42 else: 43 print(\'对方已经下线\') 44 break 45 46 # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信 47 new_socket.close() 48 49 # 7.server_socket关闭,则不再接收新的客户端请求 50 tcp_server_socket.close() 51 52 53 if __name__ == \'__main__\': 54 main()
结果如下:
小结:
最简单的 流程就是不要两个while True, 这样的服务器相当于10086一天只服务一个人后就下班
1.加第一个while True 实现了一天可以服务很多人,但是一次只能服务一个人,而且这个人只能说一句话后即退出服务,继续接收下个客户"""
2.第二个while True 实现了客服可以说多句话,但是依旧不能一次性接入多个客户(需要用到多任务)
如果你和我有共同爱好,我们可以加个好友一起交流!
以上是关于使用C语言实现服务器/客户端的TCP通信的主要内容,如果未能解决你的问题,请参考以下文章
自己用C语言构造数据包,实现TCP三次握手过程,为啥中间会产生一个RST信号?