void doAddrConf(int family, const char *ifname, char **addrnames, int count) { size_t addrsize = sizeof(IPNetIfAddr4); if (family == AF_INET6) { addrsize = sizeof(IPNetIfAddr6); }; size_t maskoff = 4; if (family == AF_INET6) { maskoff = 16; }; void *buffer = malloc(addrsize * count); memset(buffer, 0, addrsize * count); int i; for (i=0; i<count; i++) { size_t offset = addrsize * i; size_t offMask = offset + maskoff; parseAddr(family, addrnames[i], (char*) buffer + offset, (char*) buffer + offMask); }; if (_glidix_netconf_addr(family, ifname, buffer, addrsize * count) != 0) { fprintf(stderr, "%s: cannot configure %s: %s\n", progName, ifname, strerror(errno)); exit(1); }; };
/* * 创建一个Connection,连接到指定的地址,并加入到Socket的监听事件中。 * * @param spec: 格式 [upd|tcp]:ip:port * @param streamer: 数据包的双向流,用packet创建,解包,组包。 * @return 返回一个Connectoion对象指针 */ Connection *Transport::connect(const char *spec, IPacketStreamer *streamer, bool autoReconn) { MutexGuard guard(&_stopMutex); if (_stop) { return NULL; } if (NULL == spec || NULL == streamer) { ANET_LOG(WARN, "Invalid parameters for connect(%,%p,%d)", spec, streamer, autoReconn); return NULL; } char tmp[512]; char *args[32]; strncpy(tmp, spec, 512); tmp[511] = '\0'; if (parseAddr(tmp, args, 32) != 3) { return NULL; } if (strcasecmp(args[0], "tcp") == 0) { char *host = args[1]; int port = atoi(args[2]); // Socket Socket *socket = new Socket(); assert(socket); if (!socket->setAddress(host, port)) { delete socket; ANET_LOG(ERROR, "setAddress error: %s:%d, %s", host, port, spec); return NULL; } // TCPComponent TCPComponent *component = new TCPComponent(this, socket); assert(component); if (!component->init()) { delete component; ANET_LOG(ERROR, "Failed to init TCPComponent(%s:%d).", host, port); return NULL; } component->createConnection(streamer, NULL); component->setAutoReconn(autoReconn); ANET_LOG(INFO, "socket(fd:%d) connected.", component->getSocket()->getSocketHandle()); addToCheckingList(component); return component->getConnection(); } else if (strcasecmp(args[0], "udp") == 0) {} return NULL; }
/* * 起一个监听端口。 * * @param spec: 格式 [upd|tcp]:ip:port * @param streamer: 数据包的双向流,用packet创建,解包,组包。 * @param serverAdapter: 用在服务器端,当Connection初始化及Channel创建时回调时用 * @return IO组件一个对象的指针 */ IOComponent *Transport::listen (const char *spec, IPacketStreamer *streamer, IServerAdapter *serverAdapter, int timeout) { MutexGuard guard(&_stopMutex); if (_stop) { ANET_LOG(SPAM, "Transport(%p) Stoped!", this); return NULL; } if (NULL == spec || NULL == streamer || NULL == serverAdapter) { ANET_LOG(WARN, "Invalid parameters for listen(%p,%p,%p)", spec, streamer, serverAdapter); return NULL; } char tmp[512]; char *args[32]; strncpy(tmp, spec, 512); tmp[511] = '\0'; if (parseAddr(tmp, args, 32) != 3) { return NULL; } if (strcasecmp(args[0], "tcp") == 0) { char *host = args[1]; int port = atoi(args[2]); // Server Socket ServerSocket *socket = new ServerSocket(); assert(socket); if (!socket->setAddress(host, port)) { delete socket; return NULL; } // TCPAcceptor TCPAcceptor *acceptor = new TCPAcceptor(this, socket, streamer, serverAdapter, timeout); assert(acceptor); if (!acceptor->init()) { delete acceptor; return NULL; } // 返回 return acceptor; } else if (strcasecmp(args[0], "udp") == 0) {} return NULL; }
/* * 创建一个Connection,连接到指定的地址,并加入到Socket的监听事件中。 * * @param spec: 格式 [upd|tcp]:ip:port * @param streamer: 数据包的双向流,用packet创建,解包,组包。 * @return 返回一个Connectoion对象指针 */ Connection *Transport::connect(const char *spec, IPacketStreamer *streamer, bool autoReconn) { char tmp[1024]; char *args[32]; strncpy(tmp, spec, 1024); tmp[1023] = '\0'; if (parseAddr(tmp, args, 32) != 3) { return NULL; } if (strcasecmp(args[0], "tcp") == 0) { char *host = args[1]; int port = atoi(args[2]); // Socket Socket *socket = new Socket(); if (!socket->setAddress(host, port)) { delete socket; TBSYS_LOG(ERROR, "设置setAddress错误: %s:%d, %s", host, port, spec); return NULL; } // TCPComponent TCPComponent *component = new TCPComponent(this, socket, streamer, NULL); // 设置是否自动重连 component->setAutoReconn(autoReconn); if (!component->init()) { delete component; TBSYS_LOG(ERROR, "初始化失败TCPComponent: %s:%d", host, port); return NULL; } // 加入到iocomponents中,及注册可写到socketevent中 addComponent(component, true, true); component->addRef(); return component->getConnection(); } else if (strcasecmp(args[0], "udp") == 0) {} return NULL; }
/* * 起一个监听端口。 * * @param spec: 格式 [upd|tcp]:ip:port * @param streamer: 数据包的双向流,用packet创建,解包,组包。 * @param serverAdapter: 用在服务器端,当Connection初始化及Channel创建时回调时用 * @return IO组件一个对象的指针 */ IOComponent *Transport::listen(const char *spec, IPacketStreamer *streamer, IServerAdapter *serverAdapter) { char tmp[1024]; char *args[32]; strncpy(tmp, spec, 1024); tmp[1023] = '\0'; if (parseAddr(tmp, args, 32) != 3) { return NULL; } if (strcasecmp(args[0], "tcp") == 0) { char *host = args[1]; int port = atoi(args[2]); // Server Socket ServerSocket *socket = new ServerSocket(); if (!socket->setAddress(host, port)) { delete socket; return NULL; } // TCPAcceptor TCPAcceptor *acceptor = new TCPAcceptor(this, socket, streamer, serverAdapter); if (!acceptor->init()) { delete acceptor; return NULL; } // 加入到iocomponents中,及注册可读到socketevent中 addComponent(acceptor, true, false); // 返回 return acceptor; } else if (strcasecmp(args[0], "udp") == 0) {} return NULL; }