#include "mysocket.h" #include int sock_platform_init() { #ifdef _WIN32 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return -1; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { WSACleanup(); return -1; } #endif return 0; } int sock_close(int socket) { int ret = 0; #ifdef _WIN32 ret = closesocket(socket); #else ret = close(socket); #endif return ret; } int sock_platform_shutdown() { #ifdef _WIN32 WSACleanup(); #endif return 0; } int sock_readall(int sockfd, void *buf, size_t bufsize) { char *p = (char *)buf; size_t total_read = 0; while (1) { int n = recv(sockfd, p, bufsize - total_read, 0); if (n > 0) { p += n; total_read += n; if (total_read == bufsize) { break; } } else if (n == 0) { break; } else { if (errno == EAGAIN || errno == EWOULDBLOCK) { break; } else if (errno == EINTR) { continue; } else { return -1; } } } return total_read; } int sock_writeall(int socket, const void *buf, size_t n) { const char *p = (char *)buf; size_t bytes_to_write = n; int bytes_written; while (bytes_to_write > 0) { bytes_written = send(socket, p, bytes_to_write, 0); if (bytes_written >= 0) { p += bytes_written; bytes_to_write -= bytes_written; } else { if (errno == EINTR) { continue; } return -1; } } return n; }