소스 검색

add hsocket

ithewei 6 년 전
부모
커밋
7f95f10ec5
4개의 변경된 파일160개의 추가작업 그리고 35개의 파일을 삭제
  1. 3 0
      hplatform.h
  2. 70 0
      hsocket.cpp
  3. 64 0
      hsocket.h
  4. 23 35
      hsysinfo.h

+ 3 - 0
hplatform.h

@@ -29,10 +29,13 @@
     #endif
 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
     #define OS_FREEBSD
+    #define OS_BSD
 #elif defined(__NetBSD__)
     #define OS_NETBSD
+    #define OS_BSD
 #elif defined(__OpenBSD__)
     #define OS_OPENBSD
+    #define OS_BSD
 #else
     #error "Unsupported operating system platform!"
 #endif

+ 70 - 0
hsocket.cpp

@@ -0,0 +1,70 @@
+#include "hsocket.h"
+
+#ifdef OS_WIN
+class WinSocketRAII {
+public:
+    WinSocketRAII() {
+        WSADATA wsadata;
+        WSAStartup(MAKEWORD(2,2), &wsadata);
+    }
+    ~WinSocketRAII() {
+        WSACleanup();
+    }
+};
+static WinSocketRAII s_ws;
+#endif
+
+int Listen(int port) {
+    // socket -> setsockopt -> bind -> listen
+    int listenfd = socket(AF_INET, SOCK_STREAM, 0);
+    if (listenfd < 0) {
+        perror("socket");
+        return -10;
+    }
+    // note: SO_REUSEADDR means that you can reuse sockaddr of TIME_WAIT status
+    int reuseaddr = 1;
+    if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseaddr, sizeof(int)) < 0) {
+        perror("setsockopt");
+        return -11;
+    }
+    struct sockaddr_in addr;
+    unsigned int addrlen = sizeof(addr);
+    memset(&addr, 0, addrlen);
+    addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    addr.sin_port = htons(port);
+    if (bind(listenfd, (struct sockaddr*)&addr, addrlen) < 0) {
+        perror("bind");
+        return -20;
+    }
+    if (listen(listenfd, SOMAXCONN) < 0) {
+        perror("listen");
+        return -30;
+    }
+    return listenfd;
+}
+
+int Connect(const char* host, int port) {
+    // gethostbyname -> socket -> connect
+    struct sockaddr_in addr;
+    int addrlen = sizeof(addr);
+    memset(&addr, 0, addrlen);
+    addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = inet_addr(host);
+    if (addr.sin_addr.s_addr == INADDR_NONE) {
+        struct hostent* phe = gethostbyname(host);
+        if (phe == NULL)    return -10;
+        memcpy(&addr.sin_addr, phe->h_addr, phe->h_length);
+    }
+    addr.sin_port = htons(port);
+    int connfd = socket(AF_INET, SOCK_STREAM, 0);
+    if (connfd < 0) {
+        perror("socket");
+        return -20;
+    }
+    if (connect(connfd, (struct sockaddr*)&addr, addrlen) < 0) {
+        perror("connect");
+        return -30;
+    }
+    return connfd;
+}

+ 64 - 0
hsocket.h

@@ -0,0 +1,64 @@
+#ifndef HW_SOCKET_H_
+#define HW_SOCKET_H_
+
+#include "hplatform.h"
+
+// socket -> setsockopt -> bind -> listen
+// @return sockfd
+int Listen(int port);
+
+// gethostbyname -> socket -> connect
+// @return sockfd
+int Connect(const char* host, int port);
+
+#ifdef OS_WIN
+inline int blocking(int sockfd) {
+    unsigned long nb = 0;
+    return ioctlsocket(sockfd, FIONBIO, &nb);
+}
+inline int nonblocking(int sockfd) {
+    unsigned long nb = 1;
+    return ioctlsocket(sockfd, FIONBIO, &nb);
+}
+#define sockerrno   WSAGetLastError()
+#else
+#define blocking(s)     fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK)
+#define nonblocking(s)  fcntl(s, F_SETFL, fcntl(s, F_GETFL) |  O_NONBLOCK)
+#define closesocket close
+#define sockerrno   errno
+#endif
+
+inline int tcp_nodelay(int sockfd, int on = 1) {
+    return setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(int));
+}
+
+inline int tcp_nopush(int sockfd, int on = 1) {
+#ifdef TCP_NOPUSH
+    return setsockopt(sockfd, IPPROTO_TCP, TCP_NOPUSH, (const char*)&on, sizeof(int));
+#elif defined(TCP_CORK)
+    return setsockopt(sockfd, IPPROTO_TCP, TCP_CORK, (const char*)&on, sizeof(int));
+#else
+    return -10;
+#endif
+}
+
+inline int tcp_keepalive(int sockfd, int on = 1, int delay = 60) {
+    if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&on, sizeof(int)) != 0) {
+        return sockerrno;
+    }
+
+#ifdef TCP_KEEPALIVE
+    return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPALIVE, (const char*)&delay, sizeof(int));
+#elif defined(TCP_KEEPIDLE)
+    // TCP_KEEPIDLE     => tcp_keepalive_time
+    // TCP_KEEPCNT      => tcp_keepalive_probes
+    // TCP_KEEPINTVL    => tcp_keepalive_intvl
+    return setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, (const char*)&delay, sizeof(int));
+#endif
+}
+
+inline int udp_broadcast(int sockfd, int on = 1) {
+    return setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(int));
+}
+
+#endif // HW_SOCKET_H_

+ 23 - 35
hsysinfo.h

@@ -2,61 +2,49 @@
 #define H_SYS_INFO_H_
 
 #include "hplatform.h"
-#include "hfile.h"
 
-// logic processors number
+#ifdef OS_UNIX
+#include <sys/sysinfo.h>
+#endif
+
 inline int get_ncpu() {
 #ifdef OS_WIN
     SYSTEM_INFO si;
     GetSystemInfo(&si);
     return si.dwNumberOfProcessors;
 #else
-    return sysconf(_SC_NPROCESSORS_CONF);
+    //return get_nprocs();
+    //return get_nprocs_conf();
+    //return sysconf(_SC_NPROCESSORS_ONLN);     // processors available
+    return sysconf(_SC_NPROCESSORS_CONF);     // processors configured
 #endif
-    return 1;
 }
 
 typedef struct meminfo_s {
-    unsigned int total; // MB
-    unsigned int avail; // MB
+    unsigned long total; // KB
+    unsigned long free; // KB
 } meminfo_t;
 
 inline int get_meminfo(meminfo_t* mem) {
-#ifdef OS_LINUX
-    // cat /proc/meminfo
-    // MemTotal:       16432348 kB
-    // MemFree:          180704 kB
-    // MemAvailable:   10413256 kB
-    // Buffers:         1499936 kB
-    // Cached:          7066496 kB
-    HFile file;
-    if (file.open("/proc/meminfo", "r") != 0) {
-        return -10;
-    }
-    string line;
-    char name[64];
-    unsigned int num;
-    char unit[8];
-    file.readline(line);
-    sscanf(line.c_str(), "%s %u %s", name, &num, unit);
-    //printf("%s %u %s\n", name, num, unit);
-    mem->total = num >> 10;
-    file.readline(line);
-    file.readline(line);
-    sscanf(line.c_str(), "%s %u %s", name, &num, unit);
-    //printf("%s %u %s\n", name, num, unit);
-    mem->avail = num >> 10;
-    return 0;
-#elif defined(OS_WIN)
+#ifdef OS_WIN
     MEMORYSTATUSEX memstat;
     memset(&memstat, 0, sizeof(memstat));
     memstat.dwLength = sizeof(memstat);
     GlobalMemoryStatusEx(&memstat);
-    mem->total = memstat.ullTotalPhys >> 20;
-    mem->avail = memstat.ullAvailPhys >> 20;
+    mem->total = memstat.ullTotalPhys >> 10;
+    mem->free = memstat.ullAvailPhys >> 10;
+    return 0;
+#elif defined(OS_LINUX)
+    struct sysinfo info;
+    if (sysinfo(&info) < 0) {
+        return errno;
+    }
+    mem->total = info.totalram * info.mem_unit >> 10;
+    mem->free = info.freeram * info.mem_unit >> 10;
     return 0;
+#else
+    return -10;
 #endif
-    return -1;
 }
 
 #endif // H_SYS_INFO_H_