基于TCP/IP的套接字服务器端和客户端编程

本文详细介绍了基于TCP/IP的套接字编程流程,包括服务器端的创建套接字、绑定地址、监听、接受连接以及读写数据,以及客户端的创建套接字、连接服务器、读写数据和关闭连接。此外,还提到了UDP套接字编程的类似流程。重点阐述了TCP套接字编程中涉及的关键函数,如socket、connect、bind、listen、accept等,以及并发服务器的概念和关闭套接字的方法。

(本文章内容来源于网络,仅供学习之用,别无二心,希望不要有纠纷,谢谢!)

基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符。客户端随后调用connect 函数,服务器端则调用 bind、listen 和accept 函数。

TCP套接字编程流程
服务器:
1.创建套接字描述符(socket)
2.设置服务器的IP地址和端口号(需要转换为网络字节序的格式)
3.将套接字描述符绑定到服务器地址(bind)
4.将套接字描述符设置为监听套接字描述符(listen),等待来自客户端的连接请求,监听套接字维护未完成连接队列和已完成连接队列
5.从已完成连接队列中取得队首项,返回新的已连接套接字描述符(accept),如果已完成连接队列为空,则会阻塞
6.从已连接套接字描述符读取来自客户端的请求(read)
7.向已连接套接字描述符写入应答(write)
8.关闭已连接套接字描述符(close),回到第5步等待下一个客户端的连接请求

客户端:
1.创建套接字描述符(socket)
2.设置服务器的IP地址和端口号(需要转换为网络字节序的格式)
3.请求建立到服务器的TCP连接并阻塞,直到连接成功建立(connect)
4.向套接字描述符写入请求(write)
5.从套接字描述符读取来自服务器的应答(read)
6.关闭套接字描述符(close)


UDP套接字编程流程
服务器:
1.创建套接字描述符(socket)
2.设置服务器的IP地址和端口号(需要转换为网络字节序的格式)
3.将套接字描述符绑定到服务器地址(bind)
4.从套接字描述符读取来自客户端的请求并取得客户端的地址(recvfrom)
5.向套接字描述符写入应答并发送给客户端(sendto)
6.回到第4步等待读取下一个来自客户端的请求

客户端:
1.创建套接字描述符(socket)
2.设置服务器的IP地址和端口号(需要转换为网络字节序的格式)
3.向套接字描述符写入请求并发送给服务器(sendto)
4.从套接字描述符读取来自服务器的应答(recvfrom)
5.关闭套接字描述符(close)



基于 TCP 的套接字编程的所有客户端和服务器端都是从调用socket 开始,它返回一个套接字描述符。客户端随后调用connect 函数,服务器端则调用 bind、listen 和accept 函数。套接字通常使用标准的close 函数关闭,但是也可以使用 shutdown 函数关闭套接字。下面针对套接字编程实现过程中所调用的函数进程分析。以下是基于 TCP 套接字编程的流程图:


 

socket 函数

套接字是通信端点的抽象,实现端对端之间的通信。与应用程序要使用文件描述符访问文件一样,访问套接字需要套接字描述符。任何套接字编程都必须调用socket 函数获得套接字描述符,这样才能对套接字进行操作。以下是该函数的描述:

1. /* 套接字 */   

2.    

3. /*  

4.  * 函数功能:创建套接字描述符;  

5.  * 返回值:若成功则返回套接字非负描述符,若出错返回-1;  

6.  * 函数原型:  

7.  */   

8. #include <sys/socket.h>   

9.    

10.int socket(int family, int type, int protocol);   

11./*  

12. * 说明:  

13. * socket类似与open对普通文件操作一样,都是返回描述符,后续的操作都是基于该描述符;  

14. * family 表示套接字的通信域,不同的取值决定了socket的地址类型,其一般取值如下:  

15. * (1)AF_INET         IPv4因特网域  

16. * (2)AF_INET6        IPv6因特网域  

17. * (3)AF_UNIX         Unix域  

18. * (4)AF_ROUTE        路由套接字  

19. * (5)AF_KEY          密钥套接字  

20. * (6)AF_UNSPEC       未指定  

21. *  

22. * type确定socket的类型,常用类型如下:  

23. * (1)SOCK_STREAM     有序、可靠、双向的面向连接字节流套接字  

24. * (2)SOCK_DGRAM      长度固定的、无连接的不可靠数据报套接字  

25. * (3)SOCK_RAW      &nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值