Ejemplo n.º 1
0
wxServDisc::wxServDisc(void* p, const wxString& what, int type)
{
  // save our caller
  parent = p;

  // save query
  query = what;
  querytype = type;

  wxLogDebug(wxT(""));
  wxLogDebug(wxT("wxServDisc %p: about to query '%s'"), this, query.c_str());

  if((mSock = msock()) == INVALID_SOCKET) { 
    wxLogDebug(wxT("Ouch, error creating socket: ") + err);
    return;
  }

#if wxVERSION_NUMBER >= 2905 // 2.9.4 still has a bug here: http://trac.wxwidgets.org/ticket/14626  
  if( CreateThread(wxTHREAD_DETACHED) != wxTHREAD_NO_ERROR )
#else
  if( Create() != wxTHREAD_NO_ERROR )
#endif
    err.Printf(_("Could not create scan thread!"));
  else
    if( GetThread()->Run() != wxTHREAD_NO_ERROR )
      err.Printf(_("Could not start scan thread!")); 
}
Ejemplo n.º 2
0
int main(void)
{
#if 1
	std::string path = "./conf.dat";
	MyConf mcf(path); 
	struct sockaddr_in address;
	MySocket msock(mcf);
	//std::cout<<"after MySocket msock(mcf)"<<std::endl;
	char recv_buf[1024];
	ThreadPool threadpool(4, 10);
    threadpool.start();

	while(1)
	{
		memset(recv_buf, 0, sizeof(recv_buf));
		msock.recv_info(recv_buf, sizeof(recv_buf));
		std::cout<<"the data : "<<recv_buf<<std::endl;
		std::string recv_buf_str(recv_buf);
        std::vector<std::string> recv_vec = MySplit.wordSplit(recv_buf_str); 
		//MyTask* pTask = new MyTask(mcf, msock.getAddr(), recv_buf_str);
		MyTask* pTask = new MyTask(mcf, msock.getAddr(), recv_vec);
		threadpool.addTask(pTask);
	}
#endif 
	return 0;
}
Ejemplo n.º 3
0
bool QueryData::UpdateBySocket(LPSVDBQUERY lpquery,const char *pdata,S_UINT len,LPSVDBRESULT ret,string addr,S_UINT timeout)
{
	tpport_t port=m_port;
	try{
	  IPV4Host ad(addr.c_str());

		MyTCPStream msock(ad,port);

		msock.SetNoDelay(true);


		//if(!m_sock.SConnect(ad,port))
		//	return false;

		if(!Socket_Send(msock,(void *)lpquery,sizeof(SVDBQUERY),timeout))
		{
			msock.Close();
			return false;
		}

		if(!Socket_Send(msock,(void*)pdata,len,timeout))
		{
			msock.Close();
			return false;

		}
		char *pert=NULL;
		S_UINT rlen=0;


		if(!Socket_Recev(msock,(void **)&pert,rlen,timeout))
		{
			msock.Close();
			return false;
		}
		msock.Close();

		if(rlen!=sizeof(SVDBRESULT))
		{
			if(pert!=NULL)
				delete [] pert;
			return false;
		}
		memcpy(ret,pert,rlen);
		delete [] pert;

		return ret->state==SVDB_OK;

	}catch(...)
	{
		puts("socket error");
		return false;
	}




	return true;
}
Ejemplo n.º 4
0
int main(int argc, char *argv[])
{
    mdnsd d;
    struct message m;
    unsigned long int ip;
    unsigned short int port;
    struct timeval *tv;
    int bsize, ssize = sizeof(struct sockaddr_in);
    unsigned char buf[MAX_PACKET_LEN];
    struct sockaddr_in from, to;
    fd_set fds;
    int s;

    if(argc != 3) { printf("usage: mquery 12 _http._tcp.local.\n"); return; }

    d = mdnsd_new(1,1000);
    if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; }

    mdnsd_query(d,argv[2],atoi(argv[1]),ans,0);

    while(1)
    {
        tv = mdnsd_sleep(d);
        FD_ZERO(&fds);
        FD_SET(s,&fds);
        select(s+1,&fds,0,0,tv);

        if(FD_ISSET(s,&fds))
        {
            while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0)
            {
                bzero(&m,sizeof(struct message));
                message_parse(&m,buf);
                mdnsd_in(d,&m,(unsigned long int)from.sin_addr.s_addr,from.sin_port);
            }
            if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; }
        }
        while(mdnsd_out(d,&m,&ip,&port))
        {
            bzero(&to, sizeof(to));
            to.sin_family = AF_INET;
            to.sin_port = port;
            to.sin_addr.s_addr = ip;
            if(sendto(s,message_packet(&m),message_packet_len(&m),0,(struct sockaddr *)&to,sizeof(struct sockaddr_in)) != message_packet_len(&m))  { printf("can't write to socket: %s\n",strerror(errno)); return 1; }
        }
    }

    mdnsd_shutdown(d);
    mdnsd_free(d);
    return 0;
}
Ejemplo n.º 5
0
bool QueryData::QueryBySocket(LPSVDBQUERY lpquery,LPDBQUERY lpdbquery,void **pret,S_UINT &len,string addr,S_UINT timeout)
{

	tpport_t port=m_port;
	try{
		IPV4Host ad(addr.c_str());
		MyTCPStream msock(ad,port);
		//if(!m_sock.SConnect(ad,port))
		//	return false;

		msock.SetNoDelay(true);


		if(!Socket_Send(msock,(void *)lpquery,sizeof(SVDBQUERY),timeout))
		{
			msock.Close();
			return false;
		}

		if(!Socket_Send(msock,(void*)lpdbquery,sizeof(DBQUERY),timeout))
		{
			msock.Close();
			return false;

		}

		if(!Socket_Recev(msock,pret,len,timeout))
		{
			msock.Close();
			return false;
		}

		msock.Close();


	}catch(...)
	{
		puts("socket error");
		return false;
	}


	return true;
}
Ejemplo n.º 6
0
int sfattach(int s) {
    int err;
    int rc;
    /* This will ensure that s is actually a bytestream. */
    rc = bflush(s, -1);
    if(dill_slow(rc < 0)) return -1;
    /* Create a sf socket. */
    struct sf *conn = malloc(sizeof(struct sf));
    if(dill_slow(!conn)) {err = ENOMEM; goto error1;}
    conn->u = s;
    conn->ochan = channel(sizeof(struct msg), 0);
    if(dill_slow(conn->ochan < 0)) {err = errno; goto error2;}
    conn->ores = SF_ACTIVE;
    conn->ichan = channel(sizeof(struct msg), 0);
    if(dill_slow(conn->ichan < 0)) {err = errno; goto error3;}
    conn->ires = SF_ACTIVE;
    conn->oworker = go(sf_oworker(conn));
    if(dill_slow(conn->oworker < 0)) {err = errno; goto error4;}
    conn->iworker = go(sf_iworker(conn));
    if(dill_slow(conn->iworker < 0)) {err = errno; goto error5;}
    conn->res = SF_ACTIVE;
    /* Bind the object to a handle. */
    int h = msock(sf_type, conn, &sf_vfptrs);
    if(dill_slow(h < 0)) {err = errno; goto error6;}
    return h;
error6:
    rc = hclose(conn->iworker);
    dill_assert(rc == 0);
error5:
    rc = hclose(conn->oworker);
    dill_assert(rc == 0);
error4:
    rc = hclose(conn->ichan);
    dill_assert(rc == 0);
error3:
    rc = hclose(conn->ochan);
    dill_assert(rc == 0);
error2:
    free(conn);
error1:
    errno = err;
    return -1;
}
Ejemplo n.º 7
0
int main(void)
{
#if 1
	std::string path = "./conf.dat";
	MyConf mcf(path); 
	struct sockaddr_in address;
	MySocket msock(mcf);
	//std::cout<<"after MySocket msock(mcf)"<<std::endl;
	char recv_buf[1024];
	ThreadPool threadpool(4, 10);
    threadpool.start();
    MySplit mysplit;

	while(1)
	{
		memset(recv_buf, 0, sizeof(recv_buf));
		msock.recv_info(recv_buf, sizeof(recv_buf));
		std::cout<<"the data : "<<recv_buf<<std::endl;
        std::vector<std::string> recv_vec;
		recv_vec = mysplit.wordSplit(recv_buf);
        
        //std::stringstream ss(recv_buf_str);
        //std::string word;
        std::cout<<"recv_vec.size="<<recv_vec.size()<<std::endl;
        for(auto it: recv_vec)
        {
            std::cout<<it<<", ";
            recv_vec.push_back(it);
        }
        std::cout<<std::endl;
		//MyTask* pTask = new MyTask(mcf, msock.getAddr(), recv_buf_str);
		MyTask* pTask = new MyTask(mcf, msock.getAddr(), recv_vec);
		threadpool.addTask(pTask);
	}
#endif 
	return 0;
}
Ejemplo n.º 8
0
int main(int argc, char *argv[])
{
    mdnsd d;
    mdnsdr r;
    struct message m;
    unsigned long int ip;
    unsigned short int port;
    struct timeval *tv;
    int bsize, ssize = sizeof(struct sockaddr_in);
    unsigned char buf[MAX_PACKET_LEN];
    struct sockaddr_in from, to;
    fd_set fds;
    int s;
    unsigned char *packet, hlocal[256], nlocal[256];
    int len = 0;
    xht h;

    if(argc < 4) { printf("usage: mhttp 'unique name' 12.34.56.78 80 '/optionalpath'\n"); return; }

    ip = inet_addr(argv[2]);
    port = atoi(argv[3]);
    printf("Announcing .local site named '%s' to %s:%d and extra path '%s'\n",argv[1],inet_ntoa(ip),port,argv[4]);

    signal(SIGINT,done);
    signal(SIGHUP,done);
    signal(SIGQUIT,done);
    signal(SIGTERM,done);
    pipe(_zzz);
    _d = d = mdnsd_new(1,1000);
    if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; }

    sprintf(hlocal,"%s._http._tcp.local.",argv[1]);
    sprintf(nlocal,"http-%s.local.",argv[1]);
    r = mdnsd_shared(d,"_http._tcp.local.",QTYPE_PTR,120);
    mdnsd_set_host(d,r,hlocal);
    r = mdnsd_unique(d,hlocal,QTYPE_SRV,600,con,0);
    mdnsd_set_srv(d,r,0,0,port,nlocal);
    r = mdnsd_unique(d,nlocal,QTYPE_A,600,con,0);
    mdnsd_set_raw(d,r,(unsigned char *)&ip,4);
    r = mdnsd_unique(d,hlocal,16,600,con,0);
    h = xht_new(11);
    if(argc == 5 && argv[4] && strlen(argv[4]) > 0) xht_set(h,"path",argv[4]);
    packet = sd2txt(h, &len);
    xht_free(h);
    mdnsd_set_raw(d,r,packet,len);
    free(packet);

    while(1)
    {
        tv = mdnsd_sleep(d);
        FD_ZERO(&fds);
        FD_SET(_zzz[0],&fds);
        FD_SET(s,&fds);
        select(s+1,&fds,0,0,tv);

        // only used when we wake-up from a signal, shutting down
        if(FD_ISSET(_zzz[0],&fds)) read(_zzz[0],buf,MAX_PACKET_LEN);

        if(FD_ISSET(s,&fds))
        {
            while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0)
            {
                bzero(&m,sizeof(struct message));
                message_parse(&m,buf);
                mdnsd_in(d,&m,(unsigned long int)from.sin_addr.s_addr,from.sin_port);
            }
            if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; }
        }
        while(mdnsd_out(d,&m,&ip,&port))
        {
            bzero(&to, sizeof(to));
            to.sin_family = AF_INET;
            to.sin_port = port;
            to.sin_addr.s_addr = ip;
            if(sendto(s,message_packet(&m),message_packet_len(&m),0,(struct sockaddr *)&to,sizeof(struct sockaddr_in)) != message_packet_len(&m))  { printf("can't write to socket: %s\n",strerror(errno)); return 1; }
        }
        if(_shutdown) break;
    }

    mdnsd_shutdown(d);
    mdnsd_free(d);
    return 0;
}
Ejemplo n.º 9
0
void* ScanThread::Entry()
{
  mdnsd d;
  struct message m;
  unsigned long int ip;
  unsigned short int port;
  struct timeval *tv;
  fd_set fds;
  SOCKET s;
  bool exit = false;


  d = mdnsd_new(1,1000);

  if((s = msock()) < 0) 
    { 
      p->err.Printf(_("Can't create socket: %s\n"), strerror(errno));
      exit = true;
    }

  // register query(w,t) at mdnsd d, submit our address for callback ans()
  mdnsd_query(d, w.char_str(), t, ans, this);


#ifdef __WXGTK__
  // this signal is generated when we pop up a file dialog wwith wxGTK
  // we need to block it here cause it interrupts the select() call
  sigset_t            newsigs;
  sigset_t            oldsigs;
  sigemptyset(&newsigs);
  sigemptyset(&oldsigs);
  sigaddset(&newsigs, SIGRTMIN-1);
#endif


  while(!TestDestroy() && !exit)
    {
      tv = mdnsd_sleep(d);
    
      long msecs = tv->tv_sec == 0 ? 100 : tv->tv_sec*1000; // so that the while loop beneath gets executed once
      wxLogDebug(wxT("wxServDisc %p: scanthread waiting for data, timeout %i seconds"), p, tv->tv_sec);


      // we split the one select() call into several ones every 100ms
      // to be able to catch TestDestroy()...
      int datatoread = 0;
      while(msecs > 0 && !TestDestroy() && !datatoread)
	{
	  // the select call leaves tv undefined, so re-set
	  tv->tv_sec = 0;
	  tv->tv_usec = 100000; // 100 ms

	  FD_ZERO(&fds);
	  FD_SET(s,&fds);


#ifdef __WXGTK__
	  sigprocmask(SIG_BLOCK, &newsigs, &oldsigs);
#endif
	  datatoread = select(s+1,&fds,0,0,tv); // returns 0 if timeout expired

#ifdef __WXGTK__
	  sigprocmask(SIG_SETMASK, &oldsigs, NULL);
#endif

	  if(!datatoread) // this is a timeout
	    msecs-=100;
	  if(datatoread == -1)
	    break;
	}
      
      wxLogDebug(wxT("wxServDisc %p: scanthread woke up, reason: incoming data(%i), timeout(%i), error(%i), deletion(%i)"),
		 p, datatoread>0, msecs<=0, datatoread==-1, TestDestroy() );

      // receive
      if(FD_ISSET(s,&fds))
        {
	  while(recvm(&m, s, &ip, &port) > 0)
	    mdnsd_in(d, &m, ip, port);
        }

      // send
      while(mdnsd_out(d,&m,&ip,&port))
	if(!sendm(&m, s, ip, port))
	  {
	    exit = true;
	    break;
	  }
    }

  mdnsd_shutdown(d);
  mdnsd_free(d);

  return NULL;
}