#include "llcomm.h" #include #include #include #include #include #include #include Ll_comm::Ll_comm(Ll_comm_config const& cfg) :f_sd(-1) { memset(&f_adr, 0, sizeof(f_adr)); f_adr.sin_family = AF_INET; f_adr.sin_port=htons(cfg.port); if(cfg.server){ f_adr.sin_addr.s_addr = INADDR_ANY; f_sd = socket(PF_INET, SOCK_DGRAM, 0); if(f_sd==-1){ perror("socket()"); exit(1); } if(-1==bind(f_sd, (struct sockaddr*)&f_adr, sizeof(f_adr))){ perror("bind()"); close(f_sd); exit(1); } } else { f_sd=socket(PF_INET, SOCK_DGRAM, 0); struct hostent* hh = gethostbyname(cfg.host); if(hh==0){ int xx = h_errno; perror("gethostbyname()"); fprintf(stderr, "%d\n", xx); close(f_sd); exit(1); } memcpy(&f_adr.sin_addr, hh->h_addr_list[0], sizeof(f_adr.sin_addr)); f_sd = socket(PF_INET, SOCK_DGRAM, 0); if(f_sd==-1){ perror("socket()"); exit(1); } } } Ll_comm::~Ll_comm() { close(f_sd); } void Ll_comm::send_pack(void const* buf, int count) { if( (rand() & 1) != 0){ sendto(f_sd, buf, count, 0, (struct sockaddr*)&f_adr, sizeof(f_adr)); } } int Ll_comm::recv_pack(void* buf, int count, int timeout) { int r; socklen_t len; fd_set set_r; fd_set set_w; fd_set set_s; struct timeval time; int fd_max = f_sd+1; FD_ZERO(&set_r); FD_SET(f_sd, &set_r); FD_ZERO(&set_w); FD_ZERO(&set_s); time.tv_usec = (timeout % 1000)*1000; time.tv_sec = timeout/1000; r = select(fd_max, &set_r, &set_w, &set_s, &time); if(r<0){ perror("select()"); exit(1); } if(r==0){ return -1; } len = sizeof(f_adr); r = recvfrom(f_sd, buf, count, 0, (struct sockaddr*)&f_adr, &len); if(r<0){ perror("recvfrom()"); exit(1); } return r; }