CSE lab7 RPC 攻略
part A
marshall:
通过观察可以得知,所有无符号的整形的实现相当于从高位到低位的每个字节依次调用rawbyte,所有的有符号整形都是直接调用同一尺寸的无符号整形。
一种实现是调用rawbyte4次,另一种是调用ushort的重载方法两次。
unmarshall:
这回引用传参不能强转了,所以每个尺寸的无符号和有符号整形写了两遍相同的代码。
不解释,直接照搬int的实现就成。
part B
checkduplicate_and_update:
1. 遍历一遍reply_t的list(reply_window_[clt_nonce]) 对于每个reply_t对象:
1.1 如果xid等于参数xid且cb_present为true,将那个对象的buf和sz赋给参数*b和*sz,返回DONE
1.2 如果xid等于参数xid且cb_present为false,返回INPROGRESS
2. 如果list不为空 且参数xid小于所有reply_t对象的xid 返回FORGOTTEN
3. 删掉list中所有满足xid < xid_rep的对象
4. 向list插入一个新的reply_t对象,它的xid为参数xid,cb_present为false 返回NEW
*. 为了删除和判断方便,可以把list实现成按照xid升序排列的
add_reply:
1. 遍历一遍reply_t的list 对于每个reply_t对象:
1.1 如果xid等于参数xid 将参数的b和sz赋给对象的buf和sz 并将对象的cb_present置为true 之后break
marshall:
通过观察可以得知,所有无符号的整形的实现相当于从高位到低位的每个字节依次调用rawbyte,所有的有符号整形都是直接调用同一尺寸的无符号整形。
一种实现是调用rawbyte4次,另一种是调用ushort的重载方法两次。
unmarshall:
这回引用传参不能强转了,所以每个尺寸的无符号和有符号整形写了两遍相同的代码。
不解释,直接照搬int的实现就成。
part B
checkduplicate_and_update:
1. 遍历一遍reply_t的list(reply_window_[clt_nonce]) 对于每个reply_t对象:
1.1 如果xid等于参数xid且cb_present为true,将那个对象的buf和sz赋给参数*b和*sz,返回DONE
1.2 如果xid等于参数xid且cb_present为false,返回INPROGRESS
2. 如果list不为空 且参数xid小于所有reply_t对象的xid 返回FORGOTTEN
3. 删掉list中所有满足xid < xid_rep的对象
4. 向list插入一个新的reply_t对象,它的xid为参数xid,cb_present为false 返回NEW
*. 为了删除和判断方便,可以把list实现成按照xid升序排列的
add_reply:
1. 遍历一遍reply_t的list 对于每个reply_t对象:
1.1 如果xid等于参数xid 将参数的b和sz赋给对象的buf和sz 并将对象的cb_present置为true 之后break