瀏覽代碼

#302: Add TcpClient::bind UdpClient::bind

ithewei 3 年之前
父節點
當前提交
c380cf4b6e
共有 2 個文件被更改,包括 47 次插入6 次删除
  1. 27 4
      evpp/TcpClient.h
  2. 20 2
      evpp/UdpClient.h

+ 27 - 4
evpp/TcpClient.h

@@ -34,20 +34,21 @@ public:
         return loop_;
     }
 
-    //NOTE: By default, not bind local port. If necessary, you can call system api bind() after createsocket().
-    //@retval >=0 connfd, <0 error
+    // NOTE: By default, not bind local port. If necessary, you can call bind() after createsocket().
+    // @retval >=0 connfd, <0 error
     int createsocket(int remote_port, const char* remote_host = "127.0.0.1") {
         memset(&remote_addr, 0, sizeof(remote_addr));
         int ret = sockaddr_set_ipport(&remote_addr, remote_host, remote_port);
         if (ret != 0) {
-            return -1;
+            return NABS(ret);
         }
         this->remote_host = remote_host;
         this->remote_port = remote_port;
         return createsocket(&remote_addr.sa);
     }
+
     int createsocket(struct sockaddr* remote_addr) {
-        int connfd = socket(remote_addr->sa_family, SOCK_STREAM, 0);
+        int connfd = ::socket(remote_addr->sa_family, SOCK_STREAM, 0);
         // SOCKADDR_PRINT(remote_addr);
         if (connfd < 0) {
             perror("socket");
@@ -60,6 +61,28 @@ public:
         channel.reset(new TSocketChannel(io));
         return connfd;
     }
+
+    int bind(int local_port, const char* local_host = "0.0.0.0") {
+        sockaddr_u local_addr;
+        memset(&local_addr, 0, sizeof(local_addr));
+        int ret = sockaddr_set_ipport(&local_addr, local_host, local_port);
+        if (ret != 0) {
+            return NABS(ret);
+        }
+        return bind(&local_addr.sa);
+    }
+
+    int bind(struct sockaddr* local_addr) {
+        if (channel == NULL || channel->isClosed()) {
+            return -1;
+        }
+        int ret = ::bind(channel->fd(), local_addr, SOCKADDR_LEN(local_addr));
+        if (ret != 0) {
+            perror("bind");
+        }
+        return ret;
+    }
+
     // closesocket thread-safe
     void closesocket() {
         if (channel) {

+ 20 - 2
evpp/UdpClient.h

@@ -27,8 +27,8 @@ public:
         return loop_;
     }
 
-    //NOTE: By default, not bind local port. If necessary, you can call system api bind() after createsocket().
-    //@retval >=0 sockfd, <0 error
+    // NOTE: By default, not bind local port. If necessary, you can call bind() after createsocket().
+    // @retval >=0 sockfd, <0 error
     int createsocket(int remote_port, const char* remote_host = "127.0.0.1") {
         hio_t* io = hloop_create_udp_client(loop_->loop(), remote_host, remote_port);
         if (io == NULL) return -1;
@@ -37,6 +37,24 @@ public:
         channel.reset(new TSocketChannel(io));
         return channel->fd();
     }
+
+    int bind(int local_port, const char* local_host = "0.0.0.0") {
+        if (channel == NULL || channel->isClosed()) {
+            return -1;
+        }
+        sockaddr_u local_addr;
+        memset(&local_addr, 0, sizeof(local_addr));
+        int ret = sockaddr_set_ipport(&local_addr, local_host, local_port);
+        if (ret != 0) {
+            return NABS(ret);
+        }
+        ret = ::bind(channel->fd(), &local_addr.sa, SOCKADDR_LEN(&local_addr));
+        if (ret != 0) {
+            perror("bind");
+        }
+        return ret;
+    }
+
     // closesocket thread-safe
     void closesocket() {
         if (channel) {