一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)
2016-05-15 08:40
323 查看
各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起talk C栗子吧!
看官们,我们在上一回中介绍了套接字通信过程中使用的系统调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们。今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用。这些系统调用的功能十分相似,只是在操作的细节上不相同。接下来我们分别介绍他们。
这三个函数函数都是用来发送数据的,它们的功能与write函数的功能相同,只是发送的方式不同;
这三个函数中的第一个参数都是套接字描述符;
这三个函数中的参数buf都是用来存放数据的缓冲区,参数len表示位于缓冲区中数据的字节数量;
这三个函数中的flags参数表示发送数据的方式,常用的值是MSG_DONTWAIT,该值表示以非阻塞的方式 发送数据,我们也可以使用0给它赋值,此时,发送数据的方式和write函数写入数据的方式完全相同;flags还有其它的值,这些值与网络有关,而且会涉及到许多网络方面的知识,因此我们就不详细介绍了。
sendto函数中的参数dest_addr是数据接收地的地址,参数addr_len是该地址的长度;
sendmsg函数中的msg是一种结构体类型的指针,该结构体中的成员包含了其它几个函数中的参数,比如 通信的地址,还有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通信接口的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
看官们,我们在上一回中介绍了套接字通信过程中使用的系统调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们。今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用。这些系统调用的功能十分相似,只是在操作的细节上不相同。接下来我们分别介绍他们。
发送数据的系统调用
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通信接口的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
相关文章推荐
- C语言数组
- Mac下使用Eclipse实现Android中调用C/C++(NDK)基础详细教程
- LeetCode之9_Palindrome Number
- C++ boost.preprocessor自动定义枚举
- C++简单使用Jsoncpp来读取写入json文件
- GeekBand C++第一周学习感悟
- c++实验5
- c++作业5
- java语言,c语言,五子棋的实现(键盘输入坐标)。
- C++11: std::packaged_task
- c++学习笔记(2)——有关queue
- c语言学习笔记6之进制转换
- C++实现委托机制(一)
- C语言 - n的阶乘 递归
- xgboost C++ window编译问题解决与安装
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
- C++静态成员(静态成员变量、静态成员函数)与正常成员互相调用的权限问题
- 关于vector在堆上还是在栈上的思考与vector.push_back()究竟放入的是什么
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
- 17907955 2016-05-14 17:17:32 biss A - Summer Camp GNU C++11 Accepted 15 ms 2200 KB