介绍套接字
套接字是互联网用户层的接口,可以实现不同终端间的数据传递;在C中套接字的各种函数和数据结构分布在很多库里,在此不详细说每一个函数在哪个库中,使用到的程序中使用到套接字的函数都包括在以下库中
#include
在这个实验中使用UDP套接字.UDP协议和TCP协议不同,UDP不能保证每传送的数据对方能够接收到,而TCP可以.但是UDP可以比较快的传输数据,因此在实时通讯,视频会议等领域有应用.
运行环境
运行环境为Windows子系统Ubuntu 18.04 LTS
程序作用
程序分为两个部分:客户端程序和服务器程序
客户端程序把字符串yyyyyyyyyy传送给服务器,然后接受服务器传送的时间并显示
服务器程序接受客户端传送的数据.显示客户端的IP地址,端口号,客户端传来的字符串.最终把系统时间传回客户端.
客户端程序
下面分块介绍客户端程序
首先声明嵌套字,实际上嵌套字就是一个int型数据,使用socket函数初始化即可.下面socket函数传递的第一个参数为IPv4协议(PF_INET);第二个参数为无连接通讯(SOCK_DGRAM);第三个参数为UDP协议(IPPROTO_UDP)
// 创建套接字,参数:IPv4协议,连接类型,udp协议
接下来要确定服务器的地址.地址是用一个结构体表示的.struct socket_addr_in有四个元素,如下:
struct
服务器地址只是用了三个元素,协议簇初始为AF_INET,表示IPv4;sin_addr.s_addr这个元素可以看到是IP地址,但是在这里要把用字符串表示的IP地址通过inet_addr()转成需要的格式;最后一个端口号赋值为12000
注:这个结构体是继承struct sockaddr的结构体,两者大小一样,一般要使用的时候需要将struct sockaddr_in *转成struct sockaddr *
// 服务器的地址
接下来开始对服务器传送字符串buf;这里用到函数sendto();第一个参数是客户端的套接字client_fd;第二个参数是要传送的字符串buf;第三个参数是缓冲区大小,即字符串的最大长度;第四个参数不用管,传0;第五个参数传递服务器的地址,但是这里要转成基类的指针;第六个参数传递地址结构的大小,这个在之前已经计算得出为addr_size,这里也可写为sizeof(struct sockaddr)
// 初始化要传送的字符串
最后要接受从服务器传来的信息,这里使用recvfrom()函数,revcfrom函数和sendto差不多,要注意的是它的返回值.当成功接收时返回值为读取到字符串的长度,在程序中储存cc里面,之后的程序用到cc给字符串加上结束符'0'.具体程序如下:
int
整个客户端完整代码:
#include
服务器程序
服务器程序和客户端很像,只需要讨论其中的一些差别即可
服务器端程序要建立套接字并绑定到服务器的地址上,绑定的函数使用bind函数;这个函数的第一个参数就是服务器的套接字;第二个参数是服务器的地址(转成基类);第三个参数是地址大大小
// 创建套接字并绑定
服务器程序还要接受多个客户程序的请求,因此在这里设置了一个死循环,每次服务器程序接受客户信息并且发送时间之后,都等待另一个客户的信息,程序最终需要在命令行中输入Ctrl+c结束,循环的过程如下:
printf
总客户程序代码如下:
#include
运行结果
先启动服务器程序,可以看到如下界面
接下来启动客户端程序,有如下界面;在这里可以看到客户程序从服务器程序返回的数据中获得了时间
再次查看服务器端结果如下:
可以看到服务器程序已经取出IP地址,端口号和客户传来的字符串
评论
感觉C语言编写套接字真的很多细节要注意,只是很粗略讲一下都是好几千字,下次将TCP套接字估计更长,可能考虑以后写一些python的代码这样看起来比较方便