21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

error_exit:<br />

if (sock) spc_socket_close(sock);<br />

return 0;<br />

}<br />

int spc_socket_sendto(spc_socket_t *sock, const void *msg, int len, int flags,<br />

char *host, int port) {<br />

int addrlen, domain, result = -1;<br />

struct sockaddr *addr = 0;<br />

if (!(addrlen = make_sockaddr(&domain, &addr, host, port))) goto end;<br />

result = sendto(sock->sd, msg, len, flags, addr, addrlen);<br />

end:<br />

if (addr) free(addr);<br />

return result;<br />

}<br />

int spc_socket_recvfrom(spc_socket_t *sock, void *buf, int len, int flags,<br />

spc_socket_t **src) {<br />

int result;<br />

if (!(*src = (spc_socket_t *)malloc(sizeof(spc_socket_t)))) goto error_exit;<br />

(*src)->sd = INVALID_SOCKET;<br />

(*src)->domain = sock->domain;<br />

(*src)->addrlen = sock->addrlen;<br />

(*src)->flags = 0;<br />

if (!((*src)->addr = (struct sockaddr *)malloc((*src)->addrlen)))<br />

goto error_exit;<br />

result = recvfrom(sock->sd, buf, len, flags, (*src)->addr, &((*src)->addrlen));<br />

if (result = = -1) goto error_exit;<br />

return result;<br />

error_exit:<br />

if (*src) {<br />

spc_socket_close(*src);<br />

*src = 0;<br />

}<br />

return -1;<br />

}<br />

int spc_socket_send(spc_socket_t *sock, const void *buf, int buflen) {<br />

int nb, sent = 0;<br />

while (sent < buflen) {<br />

nb = send(sock->sd, (const char *)buf + sent, buflen - sent, 0);<br />

if (nb = = -1 && (errno = = EAGAIN || errno = = EINTR)) continue;<br />

if (nb

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!