接enet(四):
该函数是用于发送的socket函数,是真正的发送动作,代码中可看到是UDP网络发送,发送函数用的是sendmsg()
发送函数有三个,send/sendto/sendmsg,这里用最后一个,是因为:sendmsg可以发送一些控制信息,直接用sendmsg相比send效率应该也高一些,毕竟后者实际也是调用前者。比如说, 当你要传输的数据位于两个buffer之中,你用send,必须先把两个buffer连接成一个buffer再调用send,但是sendmsg可以直接调用
int
enet_socket_send (ENetSocket socket,
const ENetAddress * address,
const ENetBuffer * buffers,
size_t bufferCount)
{
struct msghdr msgHdr;
struct sockaddr_in sin;
int sentLength;
memset (& msgHdr, 0, sizeof (struct msghdr));
if (address != NULL)
{
memset (& sin, 0, sizeof (struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = ENET_HOST_TO_NET_16 (address -> port);
sin.sin_addr.s_addr = address -> host;
msgHdr.msg_name = & sin;
msgHdr.msg_namelen = sizeof (struct sockaddr_in);
}
msgHdr.msg_iov = (struct iovec *) buffers;
msgHdr.msg_iovlen = bufferCount;
sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL);
if (sentLength == -1)
{
if (errno == EWOULDBLOCK)
return 0;
return -1;
}
return sentLength;
}