Changeset 331 for EcnlProtoTool/trunk/mrbgems/mruby-socket
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mrbgems/mruby-socket
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mrbgems/mruby-socket/README.md
r279 r331 37 37 Copyright (c) 2013 Internet Initiative Japan Inc. 38 38 39 Permission is hereby granted, free of charge, to any person obtaining a 40 copy of this software and associated documentation files (the "Software"), 41 to deal in the Software without restriction, including without limitation 42 the rights to use, copy, modify, merge, publish, distribute, sublicense, 43 and/or sell copies of the Software, and to permit persons to whom the 39 Permission is hereby granted, free of charge, to any person obtaining a 40 copy of this software and associated documentation files (the "Software"), 41 to deal in the Software without restriction, including without limitation 42 the rights to use, copy, modify, merge, publish, distribute, sublicense, 43 and/or sell copies of the Software, and to permit persons to whom the 44 44 Software is furnished to do so, subject to the following conditions: 45 45 46 The above copyright notice and this permission notice shall be included in 46 The above copyright notice and this permission notice shall be included in 47 47 all copies or substantial portions of the Software. 48 48 49 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 50 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 51 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 52 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 53 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 54 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 49 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 50 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 51 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 52 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 53 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 54 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 55 55 DEALINGS IN THE SOFTWARE. -
EcnlProtoTool/trunk/mrbgems/mruby-socket/mrbgem.rake
r321 r331 4 4 5 5 spec.cc.include_paths << "#{build.root}/src" 6 6 7 7 # If Windows, use winsock 8 8 if ( /mswin|mingw|win32/ =~ RUBY_PLATFORM ) then -
EcnlProtoTool/trunk/mrbgems/mruby-socket/mrblib/socket.rb
r321 r331 155 155 end 156 156 157 def to_sockaddr 157 def to_sockaddr 158 158 @sockaddr 159 159 end … … 234 234 s = nil 235 235 e = SocketError 236 Addrinfo.foreach(host, service ) {|ai|236 Addrinfo.foreach(host, service, nil, Socket::SOCK_STREAM, Socket::IPPROTO_TCP) do |ai| 237 237 begin 238 238 s = Socket._socket(ai.afamily, Socket::SOCK_STREAM, 0) … … 245 245 Socket._connect(s, ai.to_sockaddr) 246 246 super(s, "r+") 247 return 247 e = nil 248 break 248 249 rescue => e0 249 250 e = e0 250 251 end 251 } 252 raise e 252 end 253 if e != nil 254 raise e 255 end 253 256 end 254 257 end -
EcnlProtoTool/trunk/mrbgems/mruby-socket/src/const.def
- Property svn:keywords deleted
-
EcnlProtoTool/trunk/mrbgems/mruby-socket/src/socket.c
r321 r331 4 4 ** See Copyright Notice in mruby.h 5 5 */ 6 #include <sys/types.h> 7 #include <sys/socket.h> 8 #include <sys/un.h> 9 #include <netinet/in.h> 10 #include <netinet/tcp.h> 11 #include <arpa/inet.h> 12 #include <fcntl.h> 13 #include <netdb.h> 14 #include <unistd.h> 6 7 #ifdef _WIN32 8 #define _WIN32_WINNT 0x0501 9 10 #include <winsock2.h> 11 #include <ws2tcpip.h> 12 #include <windows.h> 13 14 #define SHUT_RDWR SD_BOTH 15 #else 16 #include <sys/types.h> 17 #include <sys/socket.h> 18 #include <sys/un.h> 19 #include <netinet/in.h> 20 #include <netinet/tcp.h> 21 #include <arpa/inet.h> 22 #include <fcntl.h> 23 #include <netdb.h> 24 #include <unistd.h> 25 #endif 26 15 27 #include <stddef.h> 16 28 #include <string.h> 17 18 /*#include <unistd.h>*/19 extern int gethostname(char *name, size_t len);20 29 21 30 #include "mruby.h" … … 27 36 #include "error.h" 28 37 29 #ifndef NI_MAXHOST30 #define NI_MAXHOST 25531 #endif32 #ifndef NI_MAXSERV33 #define NI_MAXSERV 3234 #endif35 38 #define E_SOCKET_ERROR (mrb_class_get(mrb, "SocketError")) 36 39 … … 41 44 #endif 42 45 43 //#ifdef _WIN3246 #ifdef _WIN32 44 47 const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) 45 48 { … … 59 62 memset(&in, 0, sizeof(in)); 60 63 in.sin6_family = AF_INET6; 61 memcpy(&in.sin6_addr, src, sizeof(struct in 6_addr));64 memcpy(&in.sin6_addr, src, sizeof(struct in_addr6)); 62 65 getnameinfo((struct sockaddr *)&in, sizeof(struct 63 66 sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST); … … 92 95 } 93 96 94 //#endif97 #endif 95 98 96 99 static mrb_value … … 192 195 } 193 196 197 #ifndef _WIN32 194 198 static mrb_value 195 199 mrb_addrinfo_unix_path(mrb_state *mrb, mrb_value self) … … 202 206 return mrb_str_new_cstr(mrb, ((struct sockaddr_un *)RSTRING_PTR(sastr))->sun_path); 203 207 } 208 #endif 204 209 205 210 static mrb_value … … 256 261 static mrb_value 257 262 mrb_basicsocket_getpeereid(mrb_state *mrb, mrb_value self) 258 { 263 { 259 264 #ifdef HAVE_GETPEEREID 260 265 mrb_value ary; … … 262 267 uid_t euid; 263 268 int s; 264 269 265 270 s = socket_fd(mrb, self); 266 271 if (getpeereid(s, &euid, &egid) != 0) … … 279 284 static mrb_value 280 285 mrb_basicsocket_getpeername(mrb_state *mrb, mrb_value self) 281 { 286 { 282 287 struct sockaddr_storage ss; 283 288 socklen_t salen; 284 289 285 290 salen = sizeof(ss); 286 291 if (getpeername(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0) … … 292 297 static mrb_value 293 298 mrb_basicsocket_getsockname(mrb_state *mrb, mrb_value self) 294 { 299 { 295 300 struct sockaddr_storage ss; 296 301 socklen_t salen; 297 302 298 303 salen = sizeof(ss); 299 304 if (getsockname(socket_fd(mrb, self), (struct sockaddr *)&ss, &salen) != 0) … … 305 310 static mrb_value 306 311 mrb_basicsocket_getsockopt(mrb_state *mrb, mrb_value self) 307 { 312 { 308 313 char opt[8]; 309 314 int s; … … 325 330 static mrb_value 326 331 mrb_basicsocket_recv(mrb_state *mrb, mrb_value self) 327 { 332 { 328 333 int n; 329 334 mrb_int maxlen, flags = 0; … … 341 346 static mrb_value 342 347 mrb_basicsocket_recvfrom(mrb_state *mrb, mrb_value self) 343 { 348 { 344 349 int n; 345 350 mrb_int maxlen, flags = 0; … … 364 369 static mrb_value 365 370 mrb_basicsocket_send(mrb_state *mrb, mrb_value self) 366 { 371 { 367 372 int n; 368 373 mrb_int flags; … … 383 388 static mrb_value 384 389 mrb_basicsocket_setnonblock(mrb_state *mrb, mrb_value self) 385 { 390 { 386 391 int fd, flags; 387 392 mrb_value bool; 393 #ifdef _WIN32 394 u_long mode = 1; 395 #endif 388 396 389 397 mrb_get_args(mrb, "o", &bool); 390 398 fd = socket_fd(mrb, self); 399 #ifdef _WIN32 400 flags = ioctlsocket(fd, FIONBIO, &mode); 401 if (flags != NO_ERROR) 402 mrb_sys_fail(mrb, "ioctlsocket"); 403 #else 391 404 flags = fcntl(fd, F_GETFL, 0); 392 405 if (flags == 1) … … 398 411 if (fcntl(fd, F_SETFL, flags) == -1) 399 412 mrb_sys_fail(mrb, "fcntl"); 413 #endif 400 414 return mrb_nil_value(); 401 415 } … … 403 417 static mrb_value 404 418 mrb_basicsocket_setsockopt(mrb_state *mrb, mrb_value self) 405 { 419 { 406 420 int argc, s; 407 421 mrb_int level = 0, optname; … … 420 434 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 421 435 } else if (mrb_fixnum_p(optval)) { 422 mrb_int i = mrb_fixnum(optval); 423 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 436 if (optname == IP_MULTICAST_TTL || optname == IP_MULTICAST_LOOP) { 437 char uc = mrb_fixnum(optval); 438 optval = mrb_str_new(mrb, &uc, sizeof(uc)); 439 } else { 440 mrb_int i = mrb_fixnum(optval); 441 optval = mrb_str_new(mrb, (char *)&i, sizeof(i)); 442 } 424 443 } else { 425 444 mrb_raise(mrb, E_ARGUMENT_ERROR, "optval should be true, false, an integer, or a string"); … … 443 462 static mrb_value 444 463 mrb_basicsocket_shutdown(mrb_state *mrb, mrb_value self) 445 { 464 { 446 465 mrb_int how = SHUT_RDWR; 447 466 … … 454 473 static mrb_value 455 474 mrb_ipsocket_ntop(mrb_state *mrb, mrb_value klass) 456 { 475 { 457 476 mrb_int af, n; 458 477 char *addr, buf[50]; … … 468 487 static mrb_value 469 488 mrb_ipsocket_pton(mrb_state *mrb, mrb_value klass) 470 { 489 { 471 490 mrb_int af, n; 472 491 char *bp, buf[50]; … … 498 517 static mrb_value 499 518 mrb_ipsocket_recvfrom(mrb_state *mrb, mrb_value self) 500 { 519 { 501 520 struct sockaddr_storage ss; 502 521 socklen_t socklen; … … 528 547 mrb_value buf; 529 548 size_t bufsize; 530 549 531 550 #ifdef HOST_NAME_MAX 532 551 bufsize = HOST_NAME_MAX + 1; … … 568 587 { 569 588 mrb_value sastr; 570 int s;589 mrb_int s; 571 590 572 591 mrb_get_args(mrb, "iS", &s, &sastr); 573 if (bind( s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {592 if (bind((int)s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) { 574 593 mrb_sys_fail(mrb, "bind"); 575 594 } … … 581 600 { 582 601 mrb_value sastr; 583 int s;602 mrb_int s; 584 603 585 604 mrb_get_args(mrb, "iS", &s, &sastr); 586 if (connect( s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) {605 if (connect((int)s, (struct sockaddr *)RSTRING_PTR(sastr), (socklen_t)RSTRING_LEN(sastr)) == -1) { 587 606 mrb_sys_fail(mrb, "connect"); 588 607 } … … 593 612 mrb_socket_listen(mrb_state *mrb, mrb_value klass) 594 613 { 595 int backlog, s;614 mrb_int backlog, s; 596 615 597 616 mrb_get_args(mrb, "ii", &s, &backlog); 598 if (listen( s,backlog) == -1) {617 if (listen((int)s, (int)backlog) == -1) { 599 618 mrb_sys_fail(mrb, "listen"); 600 619 } … … 623 642 mrb_socket_sockaddr_un(mrb_state *mrb, mrb_value klass) 624 643 { 644 #ifdef _WIN32 645 mrb_raise(mrb, E_NOTIMP_ERROR, "sockaddr_un unsupported on Windows"); 646 return mrb_nil_value(); 647 #else 625 648 struct sockaddr_un *sunp; 626 649 mrb_value path, s; 627 650 628 651 mrb_get_args(mrb, "S", &path); 629 652 if (RSTRING_LEN(path) > sizeof(sunp->sun_path) - 1) { … … 637 660 mrb_str_resize(mrb, s, sizeof(struct sockaddr_un)); 638 661 return s; 662 #endif 639 663 } 640 664 … … 642 666 mrb_socket_socketpair(mrb_state *mrb, mrb_value klass) 643 667 { 668 #ifdef _WIN32 669 mrb_raise(mrb, E_NOTIMP_ERROR, "socketpair unsupported on Windows"); 670 return mrb_nil_value(); 671 #else 644 672 mrb_value ary; 645 673 mrb_int domain, type, protocol; … … 655 683 mrb_ary_push(mrb, ary, mrb_fixnum_value(sv[1])); 656 684 return ary; 685 #endif 657 686 } 658 687 … … 686 715 * will break on socket descriptors. 687 716 */ 717 #ifdef _WIN32 718 static mrb_value 719 mrb_win32_basicsocket_close(mrb_state *mrb, mrb_value self) 720 { 721 if (closesocket(socket_fd(mrb, self)) != NO_ERROR) 722 mrb_raise(mrb, E_SOCKET_ERROR, "closesocket unsuccessful"); 723 return mrb_nil_value(); 724 } 725 726 #define E_EOF_ERROR (mrb_class_get(mrb, "EOFError")) 727 static mrb_value 728 mrb_win32_basicsocket_sysread(mrb_state *mrb, mrb_value self) 729 { 730 int sd, ret; 731 mrb_value buf = mrb_nil_value(); 732 mrb_int maxlen; 733 734 mrb_get_args(mrb, "i|S", &maxlen, &buf); 735 if (maxlen < 0) { 736 return mrb_nil_value(); 737 } 738 739 if (mrb_nil_p(buf)) { 740 buf = mrb_str_new(mrb, NULL, maxlen); 741 } 742 if (RSTRING_LEN(buf) != maxlen) { 743 buf = mrb_str_resize(mrb, buf, maxlen); 744 } 745 746 sd = socket_fd(mrb, self); 747 ret = recv(sd, RSTRING_PTR(buf), maxlen, 0); 748 749 switch (ret) { 750 case 0: /* EOF */ 751 if (maxlen == 0) { 752 buf = mrb_str_new_cstr(mrb, ""); 753 } else { 754 mrb_raise(mrb, E_EOF_ERROR, "sysread failed: End of File"); 755 } 756 break; 757 case SOCKET_ERROR: /* Error */ 758 mrb_sys_fail(mrb, "recv"); 759 break; 760 default: 761 if (RSTRING_LEN(buf) != ret) { 762 buf = mrb_str_resize(mrb, buf, ret); 763 } 764 break; 765 } 766 767 return buf; 768 } 769 770 static mrb_value 771 mrb_win32_basicsocket_sysseek(mrb_state *mrb, mrb_value self) 772 { 773 mrb_raise(mrb, E_NOTIMP_ERROR, "sysseek not implemented for windows sockets"); 774 return mrb_nil_value(); 775 } 776 777 static mrb_value 778 mrb_win32_basicsocket_syswrite(mrb_state *mrb, mrb_value self) 779 { 780 int n; 781 SOCKET sd; 782 mrb_value str; 783 784 sd = socket_fd(mrb, self); 785 mrb_get_args(mrb, "S", &str); 786 n = send(sd, RSTRING_PTR(str), RSTRING_LEN(str), 0); 787 if (n == SOCKET_ERROR) 788 mrb_sys_fail(mrb, "send"); 789 return mrb_fixnum_value(n); 790 } 791 792 #endif 688 793 689 794 void … … 693 798 struct RClass *constants; 694 799 800 #ifdef _WIN32 801 WSADATA wsaData; 802 int result; 803 result = WSAStartup(MAKEWORD(2,2), &wsaData); 804 if (result != NO_ERROR) 805 mrb_raise(mrb, E_RUNTIME_ERROR, "WSAStartup failed"); 806 #else 695 807 struct RClass *usock; 808 #endif 696 809 697 810 ai = mrb_define_class(mrb, "Addrinfo", mrb->object_class); … … 699 812 mrb_define_class_method(mrb, ai, "getaddrinfo", mrb_addrinfo_getaddrinfo, MRB_ARGS_REQ(2)|MRB_ARGS_OPT(4)); 700 813 mrb_define_method(mrb, ai, "getnameinfo", mrb_addrinfo_getnameinfo, MRB_ARGS_OPT(1)); 814 #ifndef _WIN32 701 815 mrb_define_method(mrb, ai, "unix_path", mrb_addrinfo_unix_path, MRB_ARGS_NONE()); 816 #endif 702 817 703 818 io = mrb_class_get(mrb, "IO"); … … 746 861 //mrb_define_method(mrb, sock, "sysaccept", mrb_socket_accept, MRB_ARGS_NONE()); 747 862 863 #ifndef _WIN32 748 864 usock = mrb_define_class(mrb, "UNIXSocket", bsock); 865 #endif 749 866 //mrb_define_class_method(mrb, usock, "pair", mrb_unixsocket_open, MRB_ARGS_OPT(2)); 750 867 //mrb_define_class_method(mrb, usock, "socketpair", mrb_unixsocket_open, MRB_ARGS_OPT(2)); … … 755 872 756 873 /* Windows IO Method Overrides on BasicSocket */ 874 #ifdef _WIN32 875 mrb_define_method(mrb, bsock, "close", mrb_win32_basicsocket_close, MRB_ARGS_NONE()); 876 mrb_define_method(mrb, bsock, "sysread", mrb_win32_basicsocket_sysread, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1)); 877 mrb_define_method(mrb, bsock, "sysseek", mrb_win32_basicsocket_sysseek, MRB_ARGS_REQ(1)); 878 mrb_define_method(mrb, bsock, "syswrite", mrb_win32_basicsocket_syswrite, MRB_ARGS_REQ(1)); 879 #endif 757 880 758 881 constants = mrb_define_module_under(mrb, sock, "Constants"); … … 774 897 freeaddrinfo(mrb_cptr(ai)); 775 898 } 776 } 899 #ifdef _WIN32 900 WSACleanup(); 901 #endif 902 }
Note:
See TracChangeset
for help on using the changeset viewer.