当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)

一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)

2019年01月12日  | 移动技术网IT编程  | 我要评论

2014小品,钢铁之心红蜘蛛,nba热火vs公牛录像


各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起talk c栗子吧!

看官们,我们在上一回中介绍了套接字通信过程中使用的调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们。今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用。这些系统调用的功能十分相似,只是在操作的细节上不相同。接下来我们分别介绍他们。

发送数据的系统调用

ssize_t send(int sockfd, const void *buf, size_t len, int flags)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen)
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
这三个函数函数都是用来发送数据的,它们的功能与write函数的功能相同,只是发送的方式不同; 这三个函数中的第一个参数都是套接字描述符; 这三个函数中的参数buf都是用来存放数据的缓冲区,参数len表示位于缓冲区中数据的字节数量; 这三个函数中的flags参数表示发送数据的方式,常用的值是msg_dontwait,该值表示以非阻塞的方式 发送数据,我们也可以使用0给它赋值,此时,发送数据的方式和write函数写入数据的方式完全相同;flags还有其它的值,这些值与网络有关,而且会涉及到许多网络方面的知识,因此我们就不详细介绍了。 sendto函数中的参数dest_addr是数据接收地的地址,参数addr_len是该地址的长度; sendmsg函数中的msg是一种结构体类型的指针,该结构体中的成员包含了其它几个函数中的参数,比如 通信的地址,还有flags,以及缓冲区地址。此外,它还包含了一些特殊的成员,我们在这里就不做详细介绍了,以后遇到的时候再给大家做详细的介绍。

接收数据的系统调用

ssize_t recv(int sockfd, void *buf, size_t len, int flags)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen)
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
这三个函数都是用来接收数据的,它们的功能与read函数的功能相同,只是接收的方式不同; 这三个函数中的第一个参数都是套接字描述符; 这三个函数中的参数buf都是用来存放数据的缓冲区,参数len表示位于缓冲区中数据的字节数量; 这三个函数中的flags参数表示发送数据的方式,常用的值是msg_dontwait,该值表示以非阻塞的方式接收数据,我们也可以使用0给它赋值,此时,接收数据的方式和read函数读取数据的方式完全相同;flags还有其它的值,这些值与网络有关,而且会涉及到许多网络方面的知识,因此我们就不详细介绍了。 recvfrom函数中的参数src_addr是数据发送地的地址,参数addr_len是该地址的长度,使用该函数可以获取到发送数据的服务器地址,如果不想知道该地址,可以使用空指针; recvmsg函数中的msg是一种结构体类型的指针,该结构体中的成员包含了其它几个函数中参数,比如通信的地址,还有flags,以及缓冲区地址。此外,它还包含了一些特殊的成员,我们在这里就不做详细介绍了,以后遇到的时候再给大家做详细的介绍。

说了这么多的函数,大家是不是觉得有些乱,而且面对这么多的函数,都不知道如何选择了。接下来我们给一些参考性的建议。

通常情况下,使用流套接字时send/recv函数使用比较多,当然了,也可以使用另外两种函数。 使用数据报套接字时,sendto/recvfrom函数使用比较多,而send/recv函数就不能使用了,因为它没有指定通信的地址。 sendmsg/recvmsg函数主要用来传递多个缓冲区中的数据,它不受套接字类型的限制,使用范围比较广。

各位看官,关于socket通信接口的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网