数据传输
随着连接的建立,数据可能开始流动。要发送和接收数据,您可以从几个呼叫中进行选择。
如果连接两端的对等体实体都是锚定的,则可以在不指定对等体的情况下发送或接收消息。在这种情况下,你可以使用普通的read()和write()函数:
- write(s, buf, sizeof (buf));
- read(s, buf, sizeof (buf));
除了read()和write(),你还可以使用新的recv()和send()调用:
- send(s, buf, sizeof (buf), flags);
- recv(s, buf, sizeof (buf), flags);
虽然recv()和send()实际上与read()和write()相同,但是额外的flags参数很重要(在<sys/socket.h>中定义了这些标志值)。可以指定以下一个或多个标志:
MSG_OOB
发送/接收带外数据。
MSG_PEEK
不看数据。
MSG_DONTROUTE
不发送路由报文发送数据。
带外数据是特定于流套接字的概念;我们在这里不会马上考虑它。发送数据而不对传出数据包应用路由的选项目前仅由路由表管理进程使用,一般用户不太可能感兴趣。
另一方面,预览数据的能力可能非常有用。当使用recv()调用指定MSG_PEEK时,将返回存在的任何数据,但仍将其视为未读数据。也就是说,应用于套接字的下一个read()或recv()调用将返回先前查看的数据。
|