#include #include #include "wslib.h" int make_socket(unsigned short int port, SOCKET *sock) { struct sockaddr_in name; int status; /* Create the socket. */ *sock = socket(PF_INET, SOCK_STREAM, 0); if (*sock == INVALID_SOCKET) return -1; if (set_blocked(*sock, 0)) goto error; /* Give the socket a name. */ name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); status = 1; (void)setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (char *) &status, sizeof(status)); if (bind (*sock, (struct sockaddr*)&name, sizeof(name)) < 0) goto error; return 0; error: closesocket(*sock); return -1; } int init_sockaddr(struct sockaddr_in *name, const char *host_name, unsigned short int port) { struct hostent *host_info; unsigned long addr; name->sin_family = AF_INET; name->sin_port = htons(port); addr = inet_addr(host_name); if (addr == INADDR_NONE) { if (! (host_info = gethostbyname(host_name))) return -1; } else { if (! (host_info = gethostbyaddr((char*)&addr, 4, AF_INET))) return -1; } name->sin_addr = *(struct in_addr*)host_info->h_addr; return 0; } int conn_sock(char *server, int port, SOCKET *sock) { struct sockaddr_in name; int err; *sock = socket(PF_INET, SOCK_STREAM, 0); if (*sock == INVALID_SOCKET) return 0; if (init_sockaddr(&name, server, port)) goto error; if (connect(*sock, (struct sockaddr *) &name, sizeof(name)) == -1) goto error; if (set_blocked(*sock, 0)) goto error; return 1; error: err = WSAGetLastError(); closesocket(*sock); WSASetLastError(err); *sock = INVALID_SOCKET; return 0; } int write_sock(SOCKET s, char *data, int len) { int err, opt_len = sizeof(int); if (write_chars(s, data, len) == -1) return -1; if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char*)&err, &opt_len) == -1) return -1; if (err != 0) return -1; return 0; } int set_blocked(SOCKET s, int blocked) { unsigned long state; state = (unsigned long)(! blocked); return ioctlsocket(s, FIONBIO, &state); } char* read_err(int r) { if (r == 0) return "EOF"; else return ws_strerror(); } int read_chars(SOCKET s, void *ptr, int to_read) { char *p = (char*)ptr; int copied_now, copied; for (copied = 0; (unsigned)to_read > 0; ) { copied_now = recv(s, p, to_read, 0); if (copied_now <= 0) { if (copied_now == -1) { if (WSAGetLastError() != WSAEWOULDBLOCK) return copied_now; copied_now = 0; } else return copied_now; } copied += copied_now; to_read -= copied_now; p += copied_now; } return copied; } int write_chars(SOCKET s, void *ptr, int to_write) { char *p = (char*)ptr; int copied_now, copied; for (copied = 0; (unsigned)to_write > 0; ) { copied_now = send(s, p, to_write, 0); if (copied_now < 0) { if (WSAGetLastError() != WSAEWOULDBLOCK) return copied_now; copied_now = 0; } copied += copied_now; to_write -= copied_now; p += copied_now; } return copied; } .