[TCP][三] lwip_bind(a,b,c)

我们知道一个 TCP 连接由 C/S 两端的 (IP_Addr, Port_num) 唯一标识。

lwip_bind(a,b,c) 用来将之前创建的 socket 和本地的 IP_Addr / Port_num 绑定在一起。

在 [TCP][一] API 一节中,我们列出 C/S 两端常用的接口,其中 Client 并没有 lwip_bind(),而 server 却有。是不是说 Client 不需要绑定 而 Server 必须先绑定呢?答案是Yes。先看函数解析,再来谈为啥么。


目录

 

函数原型

local_ip / local_port

Client 怎么没有 bind?


 

函数原型

int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)

参数:

s,即 [TCP][二] 所讲 socket fd (>= 0)

name,即 struct sockaddr_in 的指针,用于指定要绑定的 local ip address 和 port num

namelen,即 sizeof(struct sockaddr_in)

返回:

0,绑定成功

-1,绑定失败

 

local_ip / local_port

还记得 [TCP][二] 中提到的 tcp_pcb 吗?该函数的作用就是设置 tcp_pcb 中的两个参数:local_ip 和 local_port。

当入参中的 ip address 和 port num 不为 0 时,这两个参数就设置为入参的值。

注意:如果入参的 ip 为 INADDR_ANY(即 0),则会默认使用当前网络接口的 ip address;如果入参的 port 为 0,则会随机分配一个还未使用的 port num;

即,local_ip 和 local_port 若外部指定了,就用外部指定的值;若外部没有指定,就用内部指定的值。

 

Client 怎么没有 bind?

一般 Server 端都会有 bind 这一步,为甚么 Client 端却很少见?

由前一小节我们知道,bind 动作用于指定 local_ip 和 local_port。server 端的身份(IP_Addr, Port_num)一般都是固定的,这样 Client 连接时才知道要跟哪个 ip 的哪个 port 建立连接,如果 server 端的 Port_num 随机变动,你让 Client 情何以堪。而 Client 端的 Port_num 固不固定无所谓,有个可用的 port 就行(别人又不会主动向你发起连接!),而为了避免和本地已用的 port 产生冲突,通常就不会指定必须要用某个 port,由内部自由分配还不会产生冲突,多好。

所以,一般 Server 都会用 bind 来指定使用某个固定 local_port;而 Client 一般都不指定 port,也就没有 bind 这一步。

 

嘿嘿,写完下班~

《Java程序设计》课程实验指导书程序代码(答案)(实验五:Java的异常处理),个人原创,仅供参考与交流。 希望多多交流,共同进步! 实验五 Java的异常处理 一、实验目的: 理解 java 语言中独特的异常处理机制; 掌握异常处理方法; 正确地使用捕获异常和声明抛弃异常的两种异常处理的方法; 了解自定义异常类的使用; 理解抛出异常和声明抛出异常的区别与联系; 二、实验内容: 1. 从命令行得到5个整数,放入一整型数组,然后打印输出,要求:如果输入数据不为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数”,捕获输入参数不足5个的异常(数组越界),显示“请输入至少5个整数”。 2.写一个方法void sanjiao(int a,int b,int c),判断个参数是否能构成一个角形,如果不能则抛出异常IllegalArgumentException,显示异常信息a,b,c+”不能构成角形”,如果可以构成则显示角形个边长,在主方法中得到命令行输入的个整数,调用此方法,并捕获异常。 3.自定义类Sanj,其中有成员 x,y,z,作为边长,构造方法Sanj(a,b,c)分别给x,y,z赋值,方法求面积getArea和显示角形信息(个边长)showInfo,这2个方法中当条边不能构成一个角形时要抛出自定义异常NotSanjiaoException,否则显示正确信息。在另外一个类中的主方法中构造一个Sanj对象(边为命令行输入的个整数),显示角形信息和面积,要求捕获异常。 、实验要求: 1. 通过实验掌握捕获异常和声明抛弃异常的两种异常处理的方法; 2. 程序必须能够捕获Integer.parseInt()产生的异常并作相应的处理; 3. 程序必须能够将处理的相应的信息输出出来; 4. 写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提材示,并给出解决办法。(附运行界面、源代码)。 四、实验步骤: 1. (第1题) 使用try…..catch…. finally语句对Integer.parseInt()产生的异常进行捕获处理; 2. (第2题) 定义方法void sanjiao(int a,int b,int c)中,不符合条件则抛出异常(if a+b<=c(或a+c<=b,b+c<=a) then throw new IllegalArgumentException(),),再定义main方法,调用此方法,用try…..catch…. finally语句并捕获异常; 3. (第3题) 定义角形类及相应的方法, 在定义的方法中对不符合条件则抛出异常(如上题) ,再定义main方法,对正确的数据输出正确信息,否则捕获异常; 五、自做实验 1.参考下面的程序,试修改程序,捕获相关异常,使得程序能正常运行。[提示:用错误数据测试,即可得到异常类名,运行时主方法参数输入 abc 测试] public class StringIndexOutOf{ public static void main(String args[]){ System.out.println("字符串索引越界异常"); String str=args[0]; System.out.println(“第四个字符为 ”+str.charAt(3)); int aa=Integer.parseInt(args[0]); System.out.println(“平方为 ”+aa*aa); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值