码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-15 09:44:24      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:


各位看官们,大家好,上一回中咱们说的是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通信接口的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


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

标签:

原文地址:http://blog.csdn.net/talk_8/article/details/51415765

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!