基本概念
通讯之前先通过第三方规定本次发送的包长
发送:send(fd, wr_data_buf, wr_data_len, 0); /* wr_data_buf 数据缓存, wr_data_len预先设定的固定长度 */
接收:recv(fd, wr_data_buf, wr_data_len, 0);
static int alice_send_data(int fd, char *wr_data_buf)
{
int n;
n = send(fd, wr_data_buf + offset, 1024 - off, MSG_DONTWAIT); /* 无阻塞发送了n个字节*/
if (n < 0) {
if (errno == EAGAIN || errno == EINTR)
return 0;
else {
return -1; /* error */
}
} else if (n == 0) {
return 1; /* socket close */
}
offset += n; /*记住总共发了off个字节 */
if (off < 1024) /*如果小于预先给定的长度,返回0,继续调用本函数发送 */
return 0;
return 1; /*发完了,返回1,继续下面的工作 */
}
static int alice_send_epoll(int fd, char *wr_data_buf) /* edge 方式 */
{
int offset = 0;
int finish;
do {
finish = alice_send_data(fd, wr_data_buf)
} while (!finish);
}
通讯之前先通过第三方规定长度的位置,以便接收端获取
我们看出,变长法在接收端实际上是两步固定长度法,所以它比固定长度法复杂。但是由于发送端可以灵活的指定数据的长度,也就是每次发送的数据可以不同,应用更加广泛。
3. 特殊字符串法:在私有和公共协议中实现,比变长法更复杂,但是节省包头长度字段,处理更加灵活。
通讯之前通过第三方规定一个特殊的字符串,比如说'rnrn',接收端才能据此确定数据流的边界。