再讲了服务器端的函数调用之后,终于来到了我们的客户端编程了(read/write之后会详细介绍的),客户端编程相较于服务器端来说是非常简单的了,在掌握了服务器端编程之后再看客户端编程就会胸有成竹(只需要在学一个函数即可)。
在正式开始之前我们还是来回顾一下前面的流程
服务器端: socket()-->bind( )-->listen()-->accept()-->read()/write()--->close() socket()//创建套接字 bind()//分配套接字地址 listen()//等待连接请求状态 accept()//允许连接 read()/write()//进行数据交换 close()//断开连接
客户端: socket()-->connect()-->read()/write()-->close() socket()//创建套接字 connect()//请求连接 read()/write()//进行数据交换 close()//断开连接
相信大家在看到这两张图片应该就会有一点感觉了,现在我们不知道的就只有 connectt() read() write() close()函数了。其实后面的三个用法是差不多的,也很好理解,现在我们只需要把connect()函数掌握,基本上就可以自己写一个服务器端和客户端来进行实时通信了。
那么我们开始吧。
connect(也在三次握手过程中)
#include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 参数: 第一个参数:int sockdf: socket文件描述符 第二个参数: const struct sockaddr *addr: 传入参数,指定服务器端地址信息,含IP地址和端口号 第三个参数:socklen_t addrlen: 传入参数,传入sizeof(addr)大小 返回值: 成功: 0 失败:-1,设置errno
在之前的bind()函数的博客中我们就详细的讨论了,客户端是可以使用 bind()的,但是没必要. 所以我们才可以说客户端编程是非常简单的事,因为你只需要知道服务器端的IP,端口号就行(当然协议是要一样的。)那么就能完成通信。
当客户端调用 connect()函数之后,发生一下情况之一才会返回(完成函数调用)
服务器端接收连接请求
发生断网的异常情况而终端连接请求
需要注意的是,所谓的“接收连接”并不意味着服务器调用 accept()函数,。其实是服务器端把连接请求信息记录到等待队列。因此 connect()函数返回后并不进行数据交换。而是要等服务器端 accept 之后才能进行数据交换(read、write)。
客户端端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。
这就是客户端的难点所在了。
不过要完整的客户端和服务器端就还要等博主讲到 read、write之后才会给出。敬请期待吧。