int main(int argc, char ** argv) { x4s_ike_config c = { on_ph1_initiated, on_ph1_completed, on_ph1_disposed, on_ph1_sa_used, on_ph1_validate, on_ph1_send, 0, //on_ph1_resend, on_ph1_float, on_ph1_get_psk, on_ph1_get_cert, on_ph1_get_prikey, on_ph1_get_pubkey, on_ph2_initiated, on_ph2_responded, on_ph2_completed, on_ph2_disposed, on_ph2_validate, on_ph2_send, 0, //on_ph2_resend, on_ph2_get_spi, bfalse, bfalse, 32, 0xffff }; x4s_ike_config1 ph1 = { 0 }; void * ph1context; uint32 a; int alen; /* */ x4_logf_set(on_logf); /* */ x4_crypto_init(); /* decide who's the peer */ a = inet_addr("195.20.116.69"); //195.20.116.71"); x4_memmove(&r.sin_addr, &a, 4); /* create */ s = socket(PF_INET, SOCK_DGRAM, 0); /* unblock */ socket_unblock(s); /* bind */ bind(s, (struct sockaddr*)&l, sizeof(l)); /* connect */ connect(s, (struct sockaddr*)&r, sizeof(r)); /* get IP we are bound to */ alen = sizeof(l); getsockname(s, (struct sockaddr*)&l, &alen); /* */ x4_charon_init(&c); /* */ ph1.hash = x4c_ike_a1h_sha1; ph1.cipher = x4c_ike_a1e_aes_cbc; ph1.group = x4c_ike_a1g_modp_1024; ph1.auth = x4c_ike_a1a_preshared; ph1.kbits = 128; ph1.nlen = 16; ph1.userdata = &ph1context; ph1.link.type = x4c_net_ip_v4; x4_memmove(ph1.link.l.ip.v4, &l.sin_addr, 4); ph1.link.l.port = 500; ph1.link.type = x4c_net_ip_v4; x4_memmove(ph1.link.r.ip.v4, &r.sin_addr, 4); ph1.link.r.port = 500; /* ph1.natt = 0xff; */ x4_charon_init1(&ph1); for (;;) { struct timeval tv = { 0, 500000 }; /* 50 msec */ fd_set fdr, fde; FD_ZERO(&fdr); FD_SET(s, &fdr); FD_ZERO(&fde); FD_SET(s, &fde); if (select(s+1, &fdr, 0, &fde, &tv) < 0) { x4_info("select() failed w %u\n", socket_error()); break; } if (FD_ISSET(s, &fdr)) { static char buf[1500]; int n; n = socket_recv(s, buf, sizeof(buf)); if (n > 0) { x4s_buf pkt = { 0 }; x4_info(">> %u\n", n); x4_buf_attach(&pkt, buf, n); x4_charon_recv(&ph1.link, &pkt); } } if (FD_ISSET(s, &fde)) { x4_info("socket error %u\n", socket_error()); break; } x4_charon_tick(); } return 0; }
static int socket_errno(FdMigrationState *s) { return socket_error(); }
void connect() { Q_ASSERT(m_service); //qDebug() << "Connecting to: " << m_service->serviceInfo()->device().address().toString(); m_error = QDeclarativeBluetoothSocket::NoError; if (m_socket) m_socket->deleteLater(); QBluetoothServiceInfo::Protocol socketProtocol; if (m_service->serviceInfo()->socketProtocol() == QBluetoothServiceInfo::L2capProtocol) socketProtocol = QBluetoothServiceInfo::L2capProtocol; else if (m_service->serviceInfo()->socketProtocol() == QBluetoothServiceInfo::RfcommProtocol) socketProtocol = QBluetoothServiceInfo::RfcommProtocol; else socketProtocol = QBluetoothServiceInfo::UnknownProtocol; m_socket = new QBluetoothSocket(socketProtocol); m_socket->connectToService(*m_service->serviceInfo()); QObject::connect(m_socket, SIGNAL(connected()), m_dbs, SLOT(socket_connected())); QObject::connect(m_socket, SIGNAL(disconnected()), m_dbs, SLOT(socket_disconnected())); QObject::connect(m_socket, SIGNAL(error(QBluetoothSocket::SocketError)), m_dbs, SLOT(socket_error(QBluetoothSocket::SocketError))); QObject::connect(m_socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), m_dbs, SLOT(socket_state(QBluetoothSocket::SocketState))); QObject::connect(m_socket, SIGNAL(readyRead()), m_dbs, SLOT(socket_readyRead())); }
Message receive( web::socket const & s , std::chrono::seconds timeout_in ) { static_assert( elib::aux::is_same<Message, request>::value || elib::aux::is_same<Message, response>::value , "The only two choices" ); Message msg; data_type buff(10024); data_type remaining; const auto timeout_at = std::chrono::system_clock::now() + timeout_in; auto timeout_receive = [&]() { std::error_code ec; while (std::chrono::system_clock::now() < timeout_at) { ec.clear(); ::ssize_t ret = web::receive(s, buff, ec); if (ec.value() == EAGAIN || ec.value() == EWOULDBLOCK) continue; if (ec) { ELIB_THROW_EXCEPTION(socket_error( elib::fmt( "http::receive failed with error %s" , ec.message() ) , ec )); } ELIB_ASSERT(ret >= 0); std::copy_n( buff.begin() , static_cast<std::size_t>(ret) , std::back_inserter(remaining) ); return ret; } ELIB_THROW_EXCEPTION(web_error( "http::receive timed out" )); }; // get header while (true) { timeout_receive(); auto pos = parse(remaining.begin(), remaining.end(), msg.header); if (pos == remaining.begin()) continue; remaining.erase(remaining.begin(), pos); break; } // get fields and newline while (true) { auto field_end = parse(remaining.begin(), remaining.end(), msg.fields); remaining.erase(remaining.begin(), field_end); auto newl_end = parse_newl(remaining.begin(), remaining.end()); bool have_newl = newl_end != remaining.begin(); remaining.erase(remaining.begin(), newl_end); if (have_newl) break; // receive must only happen if we fail to parse till the // newline break. othewise we could be waiting on a message // we already have timeout_receive(); } std::size_t const con_size = content_size(msg); ELIB_ASSERT(con_size >= remaining.size()); // get remaining data if needed while (remaining.size() != con_size) { timeout_receive(); } msg.data.insert(msg.data.end(), remaining.begin(), remaining.end()); return msg; }
void connect() { Q_ASSERT(m_service); qDebug() << "Connecting to: " << m_service->serviceInfo()->device().address().toString(); m_error = QLatin1String("No Error"); if(m_socket) m_socket->deleteLater(); // delete m_socket; m_socket = new QBluetoothSocket(); m_socket->connectToService(*m_service->serviceInfo()); QObject::connect(m_socket, SIGNAL(connected()), m_dbs, SLOT(socket_connected())); QObject::connect(m_socket, SIGNAL(disconnected()), m_dbs, SLOT(socket_disconnected())); QObject::connect(m_socket, SIGNAL(error(QBluetoothSocket::SocketError)), m_dbs, SLOT(socket_error(QBluetoothSocket::SocketError))); QObject::connect(m_socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), m_dbs, SLOT(socket_state(QBluetoothSocket::SocketState))); QObject::connect(m_socket, SIGNAL(readyRead()), m_dbs, SLOT(socket_readyRead())); m_stream = new QDataStream(m_socket); }
int inet_connect_opts(QemuOpts *opts, Error **errp) { struct addrinfo ai,*res,*e; const char *addr; const char *port; char uaddr[INET6_ADDRSTRLEN+1]; char uport[33]; int sock,rc; bool block; memset(&ai,0, sizeof(ai)); ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; ai.ai_family = PF_UNSPEC; ai.ai_socktype = SOCK_STREAM; addr = qemu_opt_get(opts, "host"); port = qemu_opt_get(opts, "port"); block = qemu_opt_get_bool(opts, "block", 0); if (addr == NULL || port == NULL) { fprintf(stderr, "inet_connect: host and/or port not specified\n"); error_set(errp, QERR_SOCKET_CREATE_FAILED); return -1; } if (qemu_opt_get_bool(opts, "ipv4", 0)) ai.ai_family = PF_INET; if (qemu_opt_get_bool(opts, "ipv6", 0)) ai.ai_family = PF_INET6; /* lookup */ if (0 != (rc = getaddrinfo(addr, port, &ai, &res))) { fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port, gai_strerror(rc)); error_set(errp, QERR_SOCKET_CREATE_FAILED); return -1; } for (e = res; e != NULL; e = e->ai_next) { if (getnameinfo((struct sockaddr*)e->ai_addr,e->ai_addrlen, uaddr,INET6_ADDRSTRLEN,uport,32, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { fprintf(stderr,"%s: getnameinfo: oops\n", __FUNCTION__); continue; } sock = qemu_socket(e->ai_family, e->ai_socktype, e->ai_protocol); if (sock < 0) { fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, inet_strfamily(e->ai_family), strerror(errno)); continue; } setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); if (!block) { socket_set_nonblock(sock); } /* connect to peer */ do { rc = 0; if (connect(sock, e->ai_addr, e->ai_addrlen) < 0) { rc = -socket_error(); } } while (rc == -EINTR); #ifdef _WIN32 if (!block && (rc == -EINPROGRESS || rc == -EWOULDBLOCK || rc == -WSAEALREADY)) { #else if (!block && (rc == -EINPROGRESS)) { #endif error_set(errp, QERR_SOCKET_CONNECT_IN_PROGRESS); } else if (rc < 0) { if (NULL == e->ai_next) fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__, inet_strfamily(e->ai_family), e->ai_canonname, uaddr, uport, strerror(errno)); closesocket(sock); sock = -1; continue; } freeaddrinfo(res); return sock; } error_set(errp, QERR_SOCKET_CONNECT_FAILED); freeaddrinfo(res); return -1; } int inet_dgram_opts(QemuOpts *opts) { struct addrinfo ai, *peer = NULL, *local = NULL; const char *addr; const char *port; char uaddr[INET6_ADDRSTRLEN+1]; char uport[33]; int sock = -1, rc; /* lookup peer addr */ memset(&ai,0, sizeof(ai)); ai.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; ai.ai_family = PF_UNSPEC; ai.ai_socktype = SOCK_DGRAM; addr = qemu_opt_get(opts, "host"); port = qemu_opt_get(opts, "port"); if (addr == NULL || strlen(addr) == 0) { addr = "localhost"; } if (port == NULL || strlen(port) == 0) { fprintf(stderr, "inet_dgram: port not specified\n"); return -1; } if (qemu_opt_get_bool(opts, "ipv4", 0)) ai.ai_family = PF_INET; if (qemu_opt_get_bool(opts, "ipv6", 0)) ai.ai_family = PF_INET6; if (0 != (rc = getaddrinfo(addr, port, &ai, &peer))) { fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port, gai_strerror(rc)); return -1; } /* lookup local addr */ memset(&ai,0, sizeof(ai)); ai.ai_flags = AI_PASSIVE; ai.ai_family = peer->ai_family; ai.ai_socktype = SOCK_DGRAM; addr = qemu_opt_get(opts, "localaddr"); port = qemu_opt_get(opts, "localport"); if (addr == NULL || strlen(addr) == 0) { addr = NULL; } if (!port || strlen(port) == 0) port = "0"; if (0 != (rc = getaddrinfo(addr, port, &ai, &local))) { fprintf(stderr,"getaddrinfo(%s,%s): %s\n", addr, port, gai_strerror(rc)); return -1; } /* create socket */ sock = qemu_socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol); if (sock < 0) { fprintf(stderr,"%s: socket(%s): %s\n", __FUNCTION__, inet_strfamily(peer->ai_family), strerror(errno)); goto err; } setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void*)&on,sizeof(on)); /* bind socket */ if (getnameinfo((struct sockaddr*)local->ai_addr,local->ai_addrlen, uaddr,INET6_ADDRSTRLEN,uport,32, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__); goto err; } if (bind(sock, local->ai_addr, local->ai_addrlen) < 0) { fprintf(stderr,"%s: bind(%s,%s,%d): OK\n", __FUNCTION__, inet_strfamily(local->ai_family), uaddr, inet_getport(local)); goto err; } /* connect to peer */ if (getnameinfo((struct sockaddr*)peer->ai_addr, peer->ai_addrlen, uaddr, INET6_ADDRSTRLEN, uport, 32, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { fprintf(stderr, "%s: getnameinfo: oops\n", __FUNCTION__); goto err; } if (connect(sock,peer->ai_addr,peer->ai_addrlen) < 0) { fprintf(stderr, "%s: connect(%s,%s,%s,%s): %s\n", __FUNCTION__, inet_strfamily(peer->ai_family), peer->ai_canonname, uaddr, uport, strerror(errno)); goto err; } freeaddrinfo(local); freeaddrinfo(peer); return sock; err: if (-1 != sock) closesocket(sock); if (local) freeaddrinfo(local); if (peer) freeaddrinfo(peer); return -1; } /* compatibility wrapper */ static int inet_parse(QemuOpts *opts, const char *str) { const char *optstr, *h; char addr[64]; char port[33]; int pos; /* parse address */ if (str[0] == ':') { /* no host given */ addr[0] = '\0'; if (1 != sscanf(str,":%32[^,]%n",port,&pos)) { fprintf(stderr, "%s: portonly parse error (%s)\n", __FUNCTION__, str); return -1; } } else if (str[0] == '[') { /* IPv6 addr */ if (2 != sscanf(str,"[%64[^]]]:%32[^,]%n",addr,port,&pos)) { fprintf(stderr, "%s: ipv6 parse error (%s)\n", __FUNCTION__, str); return -1; } qemu_opt_set(opts, "ipv6", "on"); } else if (qemu_isdigit(str[0])) { /* IPv4 addr */ if (2 != sscanf(str,"%64[0-9.]:%32[^,]%n",addr,port,&pos)) { fprintf(stderr, "%s: ipv4 parse error (%s)\n", __FUNCTION__, str); return -1; } qemu_opt_set(opts, "ipv4", "on"); } else { /* hostname */ if (2 != sscanf(str,"%64[^:]:%32[^,]%n",addr,port,&pos)) { fprintf(stderr, "%s: hostname parse error (%s)\n", __FUNCTION__, str); return -1; } } qemu_opt_set(opts, "host", addr); qemu_opt_set(opts, "port", port); /* parse options */ optstr = str + pos; h = strstr(optstr, ",to="); if (h) qemu_opt_set(opts, "to", h+4); if (strstr(optstr, ",ipv4")) qemu_opt_set(opts, "ipv4", "on"); if (strstr(optstr, ",ipv6")) qemu_opt_set(opts, "ipv6", "on"); return 0; } int inet_listen(const char *str, char *ostr, int olen, int socktype, int port_offset, Error **errp) { QemuOpts *opts; char *optstr; int sock = -1; opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL); if (inet_parse(opts, str) == 0) { sock = inet_listen_opts(opts, port_offset, errp); if (sock != -1 && ostr) { optstr = strchr(str, ','); if (qemu_opt_get_bool(opts, "ipv6", 0)) { snprintf(ostr, olen, "[%s]:%s%s", qemu_opt_get(opts, "host"), qemu_opt_get(opts, "port"), optstr ? optstr : ""); } else { snprintf(ostr, olen, "%s:%s%s", qemu_opt_get(opts, "host"), qemu_opt_get(opts, "port"), optstr ? optstr : ""); } } } else { error_set(errp, QERR_SOCKET_CREATE_FAILED); } qemu_opts_del(opts); return sock; }
static socket_udp *udp_init4(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) { int reuse = 1; int udpbufsize = 16 * 1024 * 1024; struct sockaddr_in s_in; unsigned int ifindex; socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); s->mode = IPv4; s->addr = NULL; s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; if (inet_pton(AF_INET, addr, &s->addr4) != 1) { struct hostent *h = gethostbyname(addr); if (h == NULL) { socket_error("Can't resolve IP address for %s", addr); free(s); return NULL; } memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4)); } if (iface != NULL) { if ((ifindex = if_nametoindex(iface)) == 0) { debug_msg("Illegal interface specification\n"); free(s); return NULL; } } else { ifindex = 0; } s->fd = socket(AF_INET, SOCK_DGRAM, 0); if (s->fd < 0) { socket_error("Unable to initialize socket"); return NULL; } if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_SNDBUF, (char *)&udpbufsize, sizeof(udpbufsize)) != 0) { debug_msg("WARNING: Unable to increase UDP sendbuffer\n"); } if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_RCVBUF, (char *)&udpbufsize, sizeof(udpbufsize)) != 0) { debug_msg("WARNING: Unable to increase UDP recvbuffer\n"); } if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEADDR"); return NULL; } #ifdef SO_REUSEPORT if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEPORT"); return NULL; } #endif s_in.sin_family = AF_INET; s_in.sin_addr.s_addr = INADDR_ANY; s_in.sin_port = htons(rx_port); if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) { socket_error("bind"); return NULL; } if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { char loop = 1; struct ip_mreq imr; imr.imr_multiaddr.s_addr = s->addr4.s_addr; imr.imr_interface.s_addr = ifindex; if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ip_mreq)) != 0) { socket_error("setsockopt IP_ADD_MEMBERSHIP"); return NULL; } #ifndef WIN32 if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) { socket_error("setsockopt IP_MULTICAST_LOOP"); return NULL; } #endif if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&s->ttl, sizeof(s->ttl)) != 0) { socket_error("setsockopt IP_MULTICAST_TTL"); return NULL; } if (SETSOCKOPT (s->fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&ifindex, sizeof(ifindex)) != 0) { socket_error("setsockopt IP_MULTICAST_IF"); return NULL; } } s->addr = strdup(addr); return s; }
static socket_udp *udp_init4(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) { int reuse = 1; struct sockaddr_in s_in; int recv_buf_size; int test_buffer; int test_buffer_size=sizeof(test_buffer); socket_udp *s = (socket_udp *)malloc(sizeof(socket_udp)); s->mode = IPv4; s->addr = NULL; s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; if (inet_pton(AF_INET, addr, &s->addr4) != 1) { struct hostent *h = gethostbyname(addr); if (h == NULL) { socket_error("Can't resolve IP address for %s", addr); free(s); return NULL; } memcpy(&(s->addr4), h->h_addr_list[0], sizeof(s->addr4)); } if (iface != NULL) { if (inet_pton(AF_INET, iface, &s->iface4_addr) != 1) { rtp_message(LOG_ERR, "Illegal interface specification"); free(s); return NULL; } } else { s->iface4_addr.s_addr = 0; } s->fd = socket(AF_INET, SOCK_DGRAM, 0); if (s->fd < 0) { socket_error("socket"); free(s); return NULL; } if (have_recv_buf_size != 0) { recv_buf_size = recv_buf_size_value; if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_RCVBUF, (char *)&recv_buf_size, sizeof(int)) != 0) { socket_error("setsockopt SO_RCVBUF"); close(s->fd); free(s); return NULL; } //Since setsockopt would not return the error if /proc/sys/net/core/rmem_max is smaller //then the value you are trying to set. use sysctl -w net.core.rmem_max=new_val //to set the value higher than what is desired in RCVBUF if( getsockopt( s->fd, SOL_SOCKET, SO_RCVBUF, (void*)&test_buffer, &test_buffer_size ) == -1 ) { socket_error("getsockopt SO_RCVBUF"); } else { //See if we could set the desired value if(test_buffer < recv_buf_size) { rtp_message(LOG_WARNING, "Failed to set the RCVBUF to %d, only could set %d\n. Check the Max kernel receive buffer size using \"sysctl net.core.rmem_max\"\n", recv_buf_size, test_buffer); } } } if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEADDR"); close(s->fd); free(s); return NULL; } #ifdef SO_REUSEPORT if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) { close(s->fd); free(s); socket_error("setsockopt SO_REUSEPORT"); return NULL; } #endif s_in.sin_family = AF_INET; s_in.sin_addr.s_addr = INADDR_ANY; s_in.sin_port = htons(rx_port); if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) { socket_error("bind: port %d", rx_port); close(s->fd); free(s); return NULL; } if (IN_MULTICAST(ntohl(s->addr4.s_addr))) { char loop = 1; #ifndef HAVE_IGMP_V3 struct ip_mreq imr; imr.imr_multiaddr.s_addr = s->addr4.s_addr; imr.imr_interface.s_addr = s->iface4_addr.s_addr; if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &imr, sizeof(struct ip_mreq)) != 0) { socket_error("setsockopt IP_ADD_MEMBERSHIP"); close(s->fd); free(s); return NULL; } #else rtp_message(LOG_DEBUG,"IGMPV3 src:%s\n", G_Multicast_Src); /* Join Multicast group with source filter */ if (G_IGMP_V3 != 0 && strcmp(G_Multicast_Src, "0.0.0.0") != 0) { struct ip_mreq_source imr; imr.imr_multiaddr.s_addr = s->addr4.s_addr; imr.imr_interface.s_addr = s->iface4_addr.s_addr; if (inet_aton(G_Multicast_Src, &imr.imr_sourceaddr) == 0) { rtp_message(LOG_ERR, "inet_aton failed for %s\n", G_Multicast_Src); return NULL; } if( setsockopt( s->fd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char*)&imr, sizeof(struct ip_mreq_source) ) == -1 ) { socket_error("setsockopt IP_ADD_SOURCE_MEMBERSHIP"); close(s->fd); free(s); return NULL; } } #endif #ifndef WIN32 if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) { socket_error("setsockopt IP_MULTICAST_LOOP"); close(s->fd); free(s); return NULL; } #endif if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &s->ttl, sizeof(s->ttl)) != 0) { socket_error("setsockopt IP_MULTICAST_TTL"); close(s->fd); free(s); return NULL; } if (s->iface4_addr.s_addr != 0) { if (SETSOCKOPT(s->fd, IPPROTO_IP, IP_MULTICAST_IF, (char *) &s->iface4_addr, sizeof(s->iface4_addr)) != 0) { close(s->fd); free(s); socket_error("setsockopt IP_MULTICAST_IF"); return NULL; } } } s->addr = strdup(addr); return s; }
void Sockethelper::setreuse() { int op = 1; if (!setsockopt(SOL_SOCKET, SO_REUSEADDR, &op, sizeof(op))) throw socket_error("setreuse"); }
void Sockethelper::setrcvbuf(int size) { if (!setsockopt(SOL_SOCKET, SO_RCVBUF, &size, sizeof(size))) throw socket_error("setrcvbuf"); }
void Sockethelper::setnodelay() { int op = 1; if (!setsockopt(IPPROTO_TCP, TCP_NODELAY, &op, sizeof(op))) throw socket_error("setnodelay"); }
void Sockethelper::listen() { if (SOCKET_ERROR == ::listen(getsocket(), SOMAXCONN)) throw socket_error("listen"); m_sock_flags.tcpserver = 1; }
static socket_udp *udp_init6(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) { #ifdef HAVE_IPv6 int reuse = 1; struct sockaddr_in6 s_in; socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); s->mode = IPv6; s->addr = NULL; s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; if (iface != NULL) { debug_msg("Not yet implemented\n"); abort(); } if (inet_pton(AF_INET6, addr, &s->addr6) != 1) { /* We should probably try to do a DNS lookup on the name */ /* here, but I'm trying to get the basics going first... */ debug_msg("IPv6 address conversion failed\n"); free(s); return NULL; } s->fd = socket(AF_INET6, SOCK_DGRAM, 0); if (s->fd < 0) { socket_error("socket"); return NULL; } if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEADDR, (char *) &reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEADDR"); return NULL; } #ifdef SO_REUSEPORT if (SETSOCKOPT(s->fd, SOL_SOCKET, SO_REUSEPORT, (char *) &reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEPORT"); return NULL; } #endif memset((char *)&s_in, 0, sizeof(s_in)); s_in.sin6_family = AF_INET6; s_in.sin6_port = htons(rx_port); #ifdef HAVE_SIN6_LEN s_in.sin6_len = sizeof(s_in); #endif s_in.sin6_addr = in6addr_any; if (bind(s->fd, (struct sockaddr *) &s_in, sizeof(s_in)) != 0) { socket_error("bind"); return NULL; } if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { unsigned int loop = 1; struct ipv6_mreq imr; #ifdef MUSICA_IPV6 imr.i6mr_interface = 1; imr.i6mr_multiaddr = s->addr6; #else imr.ipv6mr_multiaddr = s->addr6; imr.ipv6mr_interface = 0; #endif if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *) &imr, sizeof(imr)) != 0) { socket_error("setsockopt IPV6_ADD_MEMBERSHIP"); return NULL; } if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *) &loop, sizeof(loop)) != 0) { socket_error("setsockopt IPV6_MULTICAST_LOOP"); return NULL; } if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *) &ttl, sizeof(ttl)) != 0) { socket_error("setsockopt IPV6_MULTICAST_HOPS"); return NULL; } } assert(s != NULL); s->addr = strdup(addr); return s; #else UNUSED(addr); UNUSED(iface); UNUSED(rx_port); UNUSED(tx_port); UNUSED(ttl); return NULL; #endif }
QDeclarativeBluetoothSocket::QDeclarativeBluetoothSocket(QBluetoothSocket *socket, QDeclarativeBluetoothService *service, QObject *parent) : QObject(parent) { d = new QDeclarativeBluetoothSocketPrivate(this); d->m_service = service; d->m_socket = socket; d->m_connected = true; d->m_componentCompleted = true; QObject::connect(socket, SIGNAL(connected()), this, SLOT(socket_connected())); QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected())); QObject::connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socket_error(QBluetoothSocket::SocketError))); QObject::connect(socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), this, SLOT(socket_state(QBluetoothSocket::SocketState))); QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socket_readyRead())); d->m_stream = new QDataStream(socket); }
static socket_udp *udp_init6(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl) { #ifdef HAVE_IPv6 int reuse = 1; struct sockaddr_in6 s_in; socket_udp *s = (socket_udp *) malloc(sizeof(socket_udp)); s->mode = IPv6; s->addr = NULL; s->rx_port = rx_port; s->tx_port = tx_port; s->ttl = ttl; struct addrinfo hints, *res0; unsigned int ifindex; int err; if (iface != NULL) { if ((ifindex = if_nametoindex(iface)) == 0) { debug_msg("Illegal interface specification\n"); free(s); return NULL; } } else { ifindex = 0; } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; char tx_port_str[7]; sprintf(tx_port_str, "%u", tx_port); if ((err = getaddrinfo(addr, tx_port_str, &hints, &res0)) != 0) { /* We should probably try to do a DNS lookup on the name */ /* here, but I'm trying to get the basics going first... */ debug_msg("IPv6 address conversion failed: %s\n", gai_strerror(err)); free(s); return NULL; } else { memcpy(&s->sock6, res0->ai_addr, res0->ai_addrlen); memcpy(&s->addr6, &((struct sockaddr_in6 *) res0->ai_addr)->sin6_addr, sizeof(((struct sockaddr_in6 *) res0->ai_addr)->sin6_addr)); } freeaddrinfo(res0); s->fd = socket(AF_INET6, SOCK_DGRAM, 0); if (s->fd < 0) { socket_error("socket"); return NULL; } if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEADDR"); return NULL; } #ifdef SO_REUSEPORT if (SETSOCKOPT (s->fd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse, sizeof(reuse)) != 0) { socket_error("setsockopt SO_REUSEPORT"); return NULL; } #endif memset((char *)&s_in, 0, sizeof(s_in)); s_in.sin6_family = AF_INET6; s_in.sin6_port = htons(rx_port); #ifdef HAVE_SIN6_LEN s_in.sin6_len = sizeof(s_in); #endif s_in.sin6_addr = in6addr_any; if (bind(s->fd, (struct sockaddr *)&s_in, sizeof(s_in)) != 0) { socket_error("bind"); return NULL; } if (IN6_IS_ADDR_MULTICAST(&(s->addr6))) { unsigned int loop = 1; struct ipv6_mreq imr; #ifdef MUSICA_IPV6 imr.i6mr_interface = 1; imr.i6mr_multiaddr = s->addr6; #else imr.ipv6mr_multiaddr = s->addr6; imr.ipv6mr_interface = ifindex; #endif if (SETSOCKOPT (s->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&imr, sizeof(struct ipv6_mreq)) != 0) { socket_error("setsockopt IPV6_ADD_MEMBERSHIP"); return NULL; } if (SETSOCKOPT (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&loop, sizeof(loop)) != 0) { socket_error("setsockopt IPV6_MULTICAST_LOOP"); return NULL; } if (SETSOCKOPT (s->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, sizeof(ttl)) != 0) { socket_error("setsockopt IPV6_MULTICAST_HOPS"); return NULL; } if (SETSOCKOPT(s->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&ifindex, sizeof(ifindex)) != 0) { socket_error("setsockopt IPV6_MULTICAST_IF"); return NULL; } } assert(s != NULL); s->addr = strdup(addr); return s; #else UNUSED(addr); UNUSED(iface); UNUSED(rx_port); UNUSED(tx_port); UNUSED(ttl); return NULL; #endif }
void QDeclarativeBluetoothSocket::newSocket(QBluetoothSocket *socket, QDeclarativeBluetoothService *service) { if(d->m_socket){ delete d->m_socket; } d->m_service = service; d->m_socket = socket; d->m_connected = true; d->m_componentCompleted = true; d->m_error = QLatin1String("No Error"); QObject::connect(socket, SIGNAL(connected()), this, SLOT(socket_connected())); QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected())); QObject::connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socket_error(QBluetoothSocket::SocketError))); QObject::connect(socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), this, SLOT(socket_state(QBluetoothSocket::SocketState))); QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socket_readyRead())); d->m_stream = new QDataStream(socket); socket_state(socket->state()); emit connectedChanged(); }
void f_socket_error (void) { put_constant_string(socket_error(sp->u.number)); }