Просмотр исходного кода

Add bindtodevice socket option, note root is needed to use this option

mingodad 11 лет назад
Родитель
Сommit
fb2e7ff192
2 измененных файлов с 12 добавлено и 0 удалено
  1. 11 0
      SquiLu-ext/sq_socket.cpp
  2. 1 0
      SquiLu/samples/test-tcp.nut

+ 11 - 0
SquiLu-ext/sq_socket.cpp

@@ -47,6 +47,15 @@ static int opt_meth_setoption(HSQUIRRELVM v, p_opt opt, p_socket ps)
     return opt->func(v, ps);
 }
 
+/* enables reuse of local address */
+static int opt_bindtodevice(HSQUIRRELVM v, p_socket ps)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    if(sq_gettype(v, 3) != OT_STRING) return sq_throwerror(v, _SC("string expected as parameter 2"));
+    SQ_GET_STRING(v, 3, device);
+    return opt_set(v, ps, SOL_SOCKET, SO_BINDTODEVICE, (void *)device, device_size+1);
+}
+
 /* enables reuse of local address */
 static int opt_reuseaddr(HSQUIRRELVM v, p_socket ps)
 {
@@ -848,6 +857,7 @@ static t_opt tcp_opt[] = {
     {"reuseaddr",   opt_reuseaddr},
     {"tcp-nodelay", opt_tcp_nodelay},
     {"linger",      opt_linger},
+    {"bindtodevice",      opt_bindtodevice},
     {NULL,          NULL}
 };
 
@@ -1124,6 +1134,7 @@ static t_opt udp_opt[] = {
     {"ip-multicast-loop",  opt_ip_multicast_loop},
     {"ip-add-membership",  opt_ip_add_membership},
     {"ip-drop-membership", opt_ip_drop_membersip},
+    {"bindtodevice",      opt_bindtodevice},
     {NULL,          NULL}
 };
 

+ 1 - 0
SquiLu/samples/test-tcp.nut

@@ -1,6 +1,7 @@
 function download(host, file, extra_header=null){
 	local sock = socket.tcp();
 	sock.connect(host, 80);
+	//sock.setoption("bindtodevice", "wlan0"); //requires root privileges
 	local info = sock.getpeername()
 	print(info.address, info.port);
 	//sock.settimeout(1);