59
59
static void socket_close (NiceSocket *sock);
60
static gint socket_recv (NiceSocket *sock, NiceAddress *from,
61
guint len, gchar *buf);
62
static gboolean socket_send (NiceSocket *sock, const NiceAddress *to,
63
guint len, const gchar *buf);
60
static gint socket_recv_messages (NiceSocket *sock,
61
NiceInputMessage *recv_messages, guint n_recv_messages);
62
static gint socket_send_messages (NiceSocket *sock, const NiceAddress *to,
63
const NiceOutputMessage *messages, guint n_messages);
64
64
static gboolean socket_is_reliable (NiceSocket *sock);
66
66
struct UdpBsdSocketPrivate
80
83
struct UdpBsdSocketPrivate *priv;
82
85
if (addr != NULL) {
83
nice_address_copy_to_sockaddr(addr, (struct sockaddr *)&name);
86
nice_address_copy_to_sockaddr(addr, &name.addr);
85
88
memset (&name, 0, sizeof (name));
86
name.ss_family = AF_UNSPEC;
89
name.storage.ss_family = AF_UNSPEC;
89
if (name.ss_family == AF_UNSPEC || name.ss_family == AF_INET) {
92
if (name.storage.ss_family == AF_UNSPEC || name.storage.ss_family == AF_INET) {
90
93
gsock = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM,
91
94
G_SOCKET_PROTOCOL_UDP, NULL);
92
name.ss_family = AF_INET;
95
name.storage.ss_family = AF_INET;
94
name.ss_len = sizeof (struct sockaddr_in);
97
name.storage.ss_len = sizeof (struct sockaddr_in);
96
} else if (name.ss_family == AF_INET6) {
99
} else if (name.storage.ss_family == AF_INET6) {
97
100
gsock = g_socket_new (G_SOCKET_FAMILY_IPV6, G_SOCKET_TYPE_DATAGRAM,
98
101
G_SOCKET_PROTOCOL_UDP, NULL);
99
name.ss_family = AF_INET6;
102
name.storage.ss_family = AF_INET6;
100
103
#ifdef HAVE_SA_LEN
101
name.ss_len = sizeof (struct sockaddr_in6);
104
name.storage.ss_len = sizeof (struct sockaddr_in6);
167
socket_recv (NiceSocket *sock, NiceAddress *from, guint len, gchar *buf)
171
socket_recv_messages (NiceSocket *sock,
172
NiceInputMessage *recv_messages, guint n_recv_messages)
169
GSocketAddress *gaddr = NULL;
173
recvd = g_socket_receive_from (sock->fileno, &gaddr, buf, len, NULL, &gerr);
176
if (g_error_matches(gerr, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)
177
|| g_error_matches(gerr, G_IO_ERROR, G_IO_ERROR_FAILED))
183
if (recvd > 0 && from != NULL && gaddr != NULL) {
184
struct sockaddr_storage sa;
186
g_socket_address_to_native (gaddr, &sa, sizeof (sa), NULL);
187
nice_address_set_from_sockaddr (from, (struct sockaddr *)&sa);
191
g_object_unref (gaddr);
175
gboolean error = FALSE;
177
/* Read messages into recv_messages until one fails or would block, or we
179
for (i = 0; i < n_recv_messages; i++) {
180
NiceInputMessage *recv_message = &recv_messages[i];
181
GSocketAddress *gaddr = NULL;
184
gint flags = G_SOCKET_MSG_NONE;
186
recvd = g_socket_receive_message (sock->fileno,
187
(recv_message->from != NULL) ? &gaddr : NULL,
188
recv_message->buffers, recv_message->n_buffers, NULL, NULL,
189
&flags, NULL, &gerr);
191
recv_message->length = MAX (recvd, 0);
194
if (g_error_matches (gerr, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
202
if (recvd > 0 && recv_message->from != NULL && gaddr != NULL) {
204
struct sockaddr_storage storage;
205
struct sockaddr addr;
208
g_socket_address_to_native (gaddr, &sa.addr, sizeof (sa), NULL);
209
nice_address_set_from_sockaddr (recv_message->from, &sa.addr);
213
g_object_unref (gaddr);
215
/* Return early on error or EWOULDBLOCK. */
220
/* Was there an error processing the first message? */
197
socket_send (NiceSocket *sock, const NiceAddress *to,
198
guint len, const gchar *buf)
228
socket_send_message (NiceSocket *sock, const NiceAddress *to,
229
const NiceOutputMessage *message)
200
231
struct UdpBsdSocketPrivate *priv = sock->priv;
232
GError *child_error = NULL;
203
235
if (!nice_address_is_valid (&priv->niceaddr) ||
204
236
!nice_address_equal (&priv->niceaddr, to)) {
205
struct sockaddr_storage sa;
238
struct sockaddr_storage storage;
239
struct sockaddr addr;
206
241
GSocketAddress *gaddr;
209
244
g_object_unref (priv->gaddr);
210
nice_address_copy_to_sockaddr (to, (struct sockaddr *)&sa);
211
gaddr = g_socket_address_new_from_native (&sa, sizeof(sa));
246
nice_address_copy_to_sockaddr (to, &sa.addr);
247
gaddr = g_socket_address_new_from_native (&sa.addr, sizeof(sa));
212
250
if (gaddr == NULL)
215
253
priv->niceaddr = *to;
218
sent = g_socket_send_to (sock->fileno, priv->gaddr, buf, len, NULL, NULL);
220
return sent == (ssize_t)len;
256
len = g_socket_send_message (sock->fileno, priv->gaddr, message->buffers,
257
message->n_buffers, NULL, 0, G_SOCKET_MSG_NONE, NULL, &child_error);
260
if (g_error_matches (child_error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
263
g_error_free (child_error);
270
socket_send_messages (NiceSocket *sock, const NiceAddress *to,
271
const NiceOutputMessage *messages, guint n_messages)
275
for (i = 0; i < n_messages; i++) {
276
const NiceOutputMessage *message = &messages[i];
279
len = socket_send_message (sock, to, message);
284
} else if (len == 0) {