21.03.2013 Views

Problem - Kevin Tafuro

Problem - Kevin Tafuro

Problem - Kevin Tafuro

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

int opt = 1;<br />

spc_socket_t *sock = 0;<br />

if (!(sock = create_socket(type, protocol, host, port))) goto error_exit;<br />

if (sock->domain = = PF_INET) {<br />

if (setsockopt(sock->sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) = = -1)<br />

goto error_exit;<br />

if (bind(sock->sd, sock->addr, sock->addrlen) = = -1) goto error_exit;<br />

} else {<br />

if (bind(sock->sd, sock->addr, sock->addrlen) = = -1) {<br />

if (errno != EADDRINUSE) goto error_exit;<br />

if (connect(sock->sd, sock->addr, sock->addrlen) != -1) goto error_exit;<br />

remove(((struct sockaddr_un *)sock->addr)->sun_path);<br />

if (bind(sock->sd, sock->addr, sock->addrlen) = = -1) goto error_exit;<br />

}<br />

}<br />

sock->flags |= SPC_SOCKETFLAG_BOUND;<br />

if (type = = SOCK_STREAM && listen(sock->sd, SOMAXCONN) = = -1) goto error_exit;<br />

else sock->flags |= SPC_SOCKETFLAG_DGRAM;<br />

return sock;<br />

error_exit:<br />

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

return 0;<br />

}<br />

spc_socket_t *spc_socket_accept(spc_socket_t *sock) {<br />

spc_socket_t *new_sock = 0;<br />

if (!(new_sock = (spc_socket_t *)malloc(sizeof(spc_socket_t))))<br />

goto error_exit;<br />

new_sock->sd = INVALID_SOCKET;<br />

new_sock->domain = sock->domain;<br />

new_sock->addrlen = sock->addrlen;<br />

new_sock->flags = 0;<br />

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

goto error_exit;<br />

if (!(new_sock->sd = accept(sock->sd, new_sock->addr, &(new_sock->addrlen))))<br />

goto error_exit;<br />

return new_sock;<br />

error_exit:<br />

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

return 0;<br />

}<br />

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

spc_socket_t *sock = 0;<br />

if (!(sock = create_socket(SOCK_STREAM, 0, host, port))) goto error_exit;<br />

if (connect(sock->sd, sock->addr, sock->addrlen) = = -1) goto error_exit;<br />

return sock;<br />

480 | Chapter 9: Networking<br />

This is the Title of the Book, eMatter Edition<br />

Copyright © 2007 O’Reilly & Associates, Inc. All rights reserved.

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

Saved successfully!

Ooh no, something went wrong!