套接口的通信有2中基本方式:面向连接和面向非连接的通信。

面向非连接指的是通信之前不需要建立连接,我们生成了一个非连接的套接口,就可以向任何愿意接受我们消息的套接口发送消息,而且每一个消息都可以被重定向到不同的套接口。

我们之前的文章中提供socketpair函数,但是我们当时没有说这个函数是使用面向连接协议来生成套接口对的。

sendto()函数介绍

sendto函数容许我们写一个数据报,并且同时制定接受者的地址。语法如下:

#include <sys/types.h>
#include <sys/socket.h>int sendto(const void* msg,int len, unsigned flags, const struct sockaddr* to, int tolen);

如果函数调用成功,返回值就是发送的字节数,如果调用失败,返回值就是-1.我们可以通过检查errno的值来判断错误的原因。

虽然在大多数的情况下,参数flags只需要为0,但是我们还是列出了其他的值:

recvfrom函数介绍

recvfrom函数使得我们能够在接受数据报的同时,也能够得到发送者的地址,函数语法如下:

#include <sys/types.h>
#include <sys/socket.h>
int recvfrom(void* buf, int len, unsigned flags, struct sockaddr* from, int* fromlen);

函数调用成功的话返回接受缓冲区所接受的字节数,如果调用失败,返回值为-1.我们可以通过检查errno的值来判断错误的原因。

注意:如果使用函数recvfrom来接受不同的协议的数据报,那么我们就必须确定为所有可能遇到的地址族分配足够的套接口地址空间。比如地址族AF_INET和AF_LOCAL套接口地址的尺寸就不一样,通常我们可以使用c语言中的联合数据结构来解决这个问题。

下表是recvfrom参数的flags的取值,不过通常情况下我们仅仅取值为0:

下面我们来编写一个UDP数据报服务器程序:

--UNDONE(此处代码有待添加)

下面这个程序是UDP客户端程序:

--UNDONE(此处代码有待添加)

如果我们在不启动服务器程序的情况下,仅仅启动客户端程序,我们会发现客户端程序可以启动,也可以生成套接口并且要求输入,甚至函数dendto的调用也是成功的,错误来源于recvfrom,这个说明了,发送一个数据报仅仅是将数据报发送出去,但并不能说明他已经被成功接收。

  在上面的例子中大家可能注意到客户端程序在生成套接口之后,并没有调用bind函数,我们知道bind函数的作用就是限制用于进行网络通信的接口,在上面的例子中省略了对bind的调用,意味着程序可以选择任何一个接口进行发送,在效果上就如同套接口被绑定了统配套接口地址,当程序相应的时候,他也可以使用结果任何一个接口来接收数据。这个时候,套接口的端口号也是通配的。

我们也可以使用bind函数明确的指出通配地址,我们可以通过INADDR_NONE来达到目的,另外为了得到一个通配的端口号,可以将端口号指定为0.所以指定IP地址和端口号分别为INADDR_NONE和0所达到的效果和不调用bind函数的效果是相同的。

现在遇到的问题是如果客户端程序的地址和端口号都是通配的,那么服务器怎么向这个套接口进行应答呢?答案是:IP地址和端口号是数据报在发送的时候才分配的。通配端口号是从目前所有可用的端口号中随机挑选的。

如果发送主机具有多个接口,而且又发送了一个数据报,那么这个数据报的原始IP地址就可能变化,总之,原始IP地址反应的是发送数据报所使用的网络接口的IP地址。

Linux Socket学习--面向非连接的协议相关推荐

  1. Linux Socket学习--套接口的类型和协议

    我们首先来说一下PF_INET和AF_INET,虽然标准提倡在指定demain参数的时候,优先使用PF_INET,但是大量已经编写的c代码遵循旧的协议.目前情况是AF_UNIX=PF_UNIX,AF_ ...

  2. Linux Socket学习(五)

    地址转换函数 上一章中,我们已经了可以分配与初始化各种类型的套接口.这些是由一个常量进行初始化的简单例子.由一个使用变化地址的C字符串设置一个地址需要更多的编程努力.在这一章,我们将会关注建立网络地址 ...

  3. Linux Socket学习(十二)

    套接口选项 在前面的几章中,我们讨论了使用套接口的基础内容.现在我们要来探讨一些可用的其他的特征.在我们掌握了这一章的概念之后,我们就为后面的套接口的高级主题做好了准备.在这一章,我们将会专注于下列主 ...

  4. Linux Socket学习--为套接口绑定地址

    当我们使用socket函数创建一个套接口之后,这个套接口就处于无名状态,虽然之前我们提到即使没有地址,套接口也能使用,但是这个只限于套接口对在同一个Linux内核中,如果位于两台不同的主机的套接口需要 ...

  5. Linux socket学习

    1 //服务器端 server.c 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 ...

  6. Linux Socket学习(十八)--完

    一个实际的网络工程 不论我们的头脑是否在由上一章的学习中清醒过来,现在我们需要休息一下了.在这一章我们并不讨论新的内容,而是用我们所学到的这些东西来实现一些有趣的事情.在学习了这么多的东西之后来一些有 ...

  7. Linux Socket学习(十三)

    使用UDP进行广播 如果通信只能在两个单体之间完成,这样的方式是没有效率的.另一方面,广播允许同时要多个接收者传播信息. 在这一章,我们将会学习下列内容: 建立一个UDP广播套接口 使用套接口发送广播 ...

  8. linux socket 阻塞与非阻塞,同步与异步

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步:       所谓同步,就是在c端发出 ...

  9. Linux驱动学习--HDMI开发(一) 相关协议及传输原理的介绍

    目录 一.引言 二.HDMI硬件接口及相关协议 -------> TMDS(转换最小化差分信令) -------> CEC(消费电子控制) -------> DDC(显示数据通道) ...

最新文章

  1. 区块链应用于供应链金融的完整解决方案
  2. CVPR 2017 ADNet:《 Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning》论文笔记
  3. html关于强制显示、隐藏浏览器的滚动条
  4. halcon/c++接口基础 之内存管理
  5. java拉起服务,从Java调用Restful服务
  6. 怎么用EasyRecovery恢复sd卡中的数据
  7. Oracle SQL篇(四)group by 分组与分组的加强 rollup
  8. 三菱伺服驱动器示例_三菱伺服电机+编码器(伺服控制器)的接线示例
  9. ESP32烧录Marlin固件
  10. 游戏外挂开发原理初探——植物大战僵尸内存挂为例
  11. 影响世界的100条管理名言
  12. CDH Parcel包starrocks集成cloudera Manager
  13. 微信小程序小Demo
  14. linux脚本echo off,echo什么意思_@echo off的作用 - 编程语言及工具 - 电子发烧友网
  15. OpenglES2.0 for Android:来做个地球吧
  16. USB驱动转换成VISA驱动供Labview调用
  17. APP推广可以耍流氓?这些APP黑科技确实很流氓!
  18. K8S创建NFS存储
  19. erp沙盘采购总监的心得_(完整word版)ERP沙盘模拟采购总监心得
  20. Lab - K-Means

热门文章

  1. heartbeat V2实现MySQL+NFS高可用
  2. Lync 客户端功能对比之IM功能
  3. RE管理器root explorer基础操作教程
  4. OSPF基本概念单与区域配置
  5. 《卓有成效的管理者》培训分享——来自项目管理群的讨论
  6. 使用Data URI Scheme优雅的实现前端导出csv
  7. mysql主从中异步和半同步的区别
  8. linux的functions之killproc函数详解
  9. python学习之网络编程
  10. Unity3d札记 --TanksTutorial收获与总结