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!")); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }