#include #include #include #include #include #include #include #include #include #include #include #include #include "event.h" #include "trace.h" #include "mond.h" #include "sock.h" void sock_on_read(int fd, short event, void *data) { struct sock_t *sock = (struct sock_t *)data; int len; char chr[1024]; TRACE_ENTER len = read(sock->fd, &chr, 1024); if (sock->on_read) { sock->on_read(sock->data, len, chr); event_set(&sock->ev, sock->fd, EV_READ, sock_on_read, sock); sock->tv.tv_sec = 5; sock->tv.tv_usec = 0; event_add(&sock->ev, &sock->tv); } TRACE_LEAVE } void sock_on_connect(int fd, short event, void *data) { struct sock_t *sock = (struct sock_t *)data; TRACE_ENTER if (event == EV_TIMEOUT) { if (sock->on_error) sock->on_error(sock->data, SOCK_CONNREF); TRACE_LEAVE return; } if (sock->on_connect) sock->on_connect(sock->data); if (sock->on_read) { event_set(&sock->ev, sock->fd, EV_READ, sock_on_read, sock); sock->tv.tv_sec = 5; sock->tv.tv_usec = 0; event_add(&sock->ev, &sock->tv); } TRACE_LEAVE } int sock_connect(struct sock_t *sock) { struct sockaddr_in sin; int ce; char c[10]; TRACE_ENTER DEBUG("connecting to %s:%d\n", sock->ip, sock->port); sock->fd = socket(AF_INET, SOCK_STREAM, 0); if (sock->fd == -1) { return -1; } sin.sin_port = htons(sock->port); if (inet_aton(sock->ip, &sin.sin_addr) != 1) { perror("inet_aton"); exit(0); } DEBUG("ip %s:%d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); sin.sin_family = AF_INET; fcntl(sock->fd, F_SETFL, O_NONBLOCK); event_set(&sock->ev, sock->fd, EV_READ, sock_on_connect, sock); sock->tv.tv_sec = 50; sock->tv.tv_usec = 0; event_add(&sock->ev, &sock->tv); ce = connect(sock->fd, (struct sockaddr *)&sin, sizeof(sin)); if (ce == -1) { if (errno != EINPROGRESS) { // sads :( DEBUG("connect() failed: %d\n", errno); perror("connect"); TRACE_LEAVE return -1; } } TRACE_LEAVE } int sock_write(struct sock_t *sock, char *data, int len) { int ret; TRACE_ENTER; DEBUG("writing to %d the data:\n%s\n-------------\n", sock->fd, data); ret = write(sock->fd, data, len); DEBUG("writing to %d the data:\n%s\n-------------\n", sock->fd, data); TRACE_LEAVE; return ret; } void sock_free(struct sock_t *sock) { TRACE_ENTER; { close(sock->fd); sock->fd = -1; } TRACE_LEAVE; }