int algo_proc(void *_img) { img = (typeof(img))_img; process(); if (selected(sock)) { char buf[128]; udprecv(sock, buf, sizeof(buf)); printf("got %c\n", *buf); if (*buf == 'q') return 1; if (*buf == 'a') { acting = 1; readxml("./act.xml"); acting = 0; } if (*buf == 's') writexml("./config.xml"); if (*buf == 'l') readxml("./config.xml"); if (*buf == 'r') readxml("./default.xml"); writexml("./cur.xml"); } return 0; }
int main(int argc, char **argv){ char *optstr = "s:"; char *usage = "npemwinudprecv [-s size] [host] <port>"; int status = 0; int c; while((status == 0) && ((c = getopt(argc, argv, optstr)) != -1)){ switch(c){ case 's': g.size = atoi(optarg); break; default: status = 1; errx(1, "%s", usage); break; } } if(optind == argc - 1) g.service = argv[optind++]; else if(optind == argc - 2){ g.host = argv[optind++]; g.service = argv[optind++]; }else errx(1, "%s", usage); status = udprecv(); return(status != 0 ? 1 : 0); }
size_t net_peer_recv(net_peer_t* peer, void* buf, size_t len, int64_t deadline) { switch(peer->type) { case NET_PROTO_UNIX: return unixrecv((unixsock)peer->socket, buf, len, deadline); case NET_PROTO_TCP: return tcprecv((tcpsock)peer->socket, buf, len, deadline); case NET_PROTO_UDP: return udprecv((udpsock)peer->socket, 0, buf, len, deadline); } return 0; }
int main() { udpsock s1 = udplisten(iplocal(NULL, 5555, 0)); udpsock s2 = udplisten(iplocal(NULL, 5556, 0)); ipaddr addr = ipremote("127.0.0.1", 5556, 0, -1); while(1) { udpsend(s1, addr, "ABC", 3); assert(errno == 0); char buf[3]; size_t sz = udprecv(s2, &addr, buf, sizeof(buf), now() + 100); if(errno == ETIMEDOUT) continue; assert(errno == 0); assert(sz == 3); break; } while(1) { udpsend(s2, addr, "DEF", 3); assert(errno == 0); char buf[3]; size_t sz = udprecv(s1, &addr, buf, sizeof(buf), now() + 100); if(errno == ETIMEDOUT) continue; assert(errno == 0); assert(sz == 3); break; } udpclose(s2); udpclose(s1); return 0; }
int main(int argc, char **argv) { Uint16 port; char *host,*fname,*fbasename; Sint32 flen,pos,p2; int len,blocks,i,err=0; Uint32 ack; IPaddress ip; UDPsocket sock; UDPpacket *in, *out; FILE *f; /* check our commandline */ if(argc<4) { printf("%s host port file\n",argv[0]); exit(0); } /* initialize SDL */ if(SDL_Init(0)==-1) { printf("SDL_Init: %s\n",SDL_GetError()); exit(1); } /* initialize SDL_net */ if(SDLNet_Init()==-1) { printf("SDLNet_Init: %s\n",SDLNet_GetError()); exit(2); } /* get the host from the commandline */ host=argv[1]; /* get the port from the commandline */ port=(Uint16) strtol(argv[2],NULL,0); if(!port) { printf("a server port cannot be 0.\n"); exit(3); } /* get filename to get from server from commandline */ fname=argv[3]; if(SDLNet_ResolveHost(&ip,host,port)==-1) { printf("SDLNet_ResolveHost: %s\n",SDLNet_GetError()); exit(4); } /* open udp client socket */ if(!(sock=SDLNet_UDP_Open(0))) { printf("SDLNet_UDP_Open: %s\n",SDLNet_GetError()); exit(5); } /* allocate max packet */ if(!(out=SDLNet_AllocPacket(65535))) { printf("SDLNet_AllocPacket: %s\n",SDLNet_GetError()); exit(6); } if(!(in=SDLNet_AllocPacket(65535))) { printf("SDLNet_AllocPacket: %s\n",SDLNet_GetError()); exit(6); } /* bind server address to channel 0 */ if(SDLNet_UDP_Bind(sock, 0, &ip)==-1) { printf("SDLNet_UDP_Bind: %s\n",SDLNet_GetError()); exit(7); } /* open output file */ fbasename=strrchr(fname,'/'); if(!fbasename) fbasename=fname; else fbasename++; printf("writting file: %s\n",fbasename); if(!(f=fopen(fbasename,"wb"))) { perror("fopen"); exit(8); } /* request file / expect filesize */ printf("requesting file=%s\n",fname); out->data[0]=1<<4; strcpy((char*)out->data+1,fname); out->len=strlen(fname)+2; if(udpsend(sock,0,out,in,200,1,TIMEOUT)<1) exit(9); flen=SDLNet_Read32(in->data+1); len=SDLNet_Read32(in->data+5); blocks=(flen+len-1)/len; printf("flen=%d blocksize=%d blocks=%d\n",flen,len,blocks); /* send ready / expect file */ printf("starting transfer\n"); out->data[0]=2<<4; out->len=1; if(udpsend(sock,0,out,in,10,2,TIMEOUT)<1) exit(10); if(flen<0) { printf("file not available...\n"); exit(11); } pos=0; /* count per 32 blocks */ while(pos*32<blocks && !err) { /*printf("pos=%d\n",pos); */ ack=0; if((pos+1)*32>=blocks) { for(i=blocks%32;i<32;i++) ack|=1<<i; } printf("\r " "\r%3d%% %08x: ",(pos*3200)/blocks,pos*32*len); while(ack!=0xffffffff && !err) { i=in->data[1]; p2=SDLNet_Read32(in->data+2); /*printf("received %d,%d\n",i,p2); */ if(!(ack&1<<i) && p2>=pos*32*len) { fseek(f,p2,SEEK_SET); fwrite(in->data+6,in->len-6,1,f); ack|=1<<i; printf("."); fflush(stdout); } if(ack!=0xffffffff) err=udprecv(sock,in,10,2,500); if(err<0) continue; /* error... */ if(!err) { /*printf("sending ack 0x%0X\n",ack); */ out->data[0]=3<<4; SDLNet_Write32(pos*32*len,out->data+1); SDLNet_Write32(ack,out->data+5); out->len=9; SDLNet_UDP_Send(sock,0,out); } err=0; } pos++; } printf("\ndone.\n"); fclose(f); /* close the socket */ SDLNet_UDP_Close(sock); /* free packets */ SDLNet_FreePacket(out); SDLNet_FreePacket(in); /* shutdown SDL_net */ SDLNet_Quit(); /* shutdown SDL */ SDL_Quit(); return(0); }