void Listener::read_cb(evutil_socket_t fd, short what){ //TODO:locker //LOCK(lev); while (true) { struct sockaddr_storage ss; #ifdef WIN32 int socklen = sizeof(ss); #else socklen_t socklen = sizeof(ss); #endif evutil_socket_t new_fd = accept(fd, (struct sockaddr*)&ss, &socklen); if (!isSocketValid(new_fd)) break; if (!(this->flags & LEV_OPT_LEAVE_SOCKETS_BLOCKING)) evutil_make_socket_nonblocking(new_fd); ++this->refcnt; //TODO //UNLOCK(lev); this->on_new_conn_accepted(new_fd,(struct sockaddr*)&ss, (int)socklen); //LOCK(lev); if (this->refcnt == 1) { MYASSERT(this->decref_and_unlock()); return; } else --this->refcnt; } int err = evutil_socket_geterror(fd); if (!MY_ERR_ACCEPT_RETRIABLE(err)) { ++this->refcnt; //UNLOCK(lev); this->on_fatal_error(); //LOCK(lev); this->decref_and_unlock(); } //TODO //UNLOCK(lev); }
int main() { if (initSockets() != 0) { fprintf(stderr, "cannot initialize sockets\n"); exit(EXIT_FAILURE); } SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); if (!isSocketValid(sock)) { fprintf(stderr, "cannot create socket\n"); quitSockets(); exit(EXIT_FAILURE); } int opt = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof(opt)); struct sockaddr_in socketInfo; socketInfo.sin_family = AF_INET; socketInfo.sin_addr.s_addr = INADDR_ANY; socketInfo.sin_port = htons(PORT); if (bind(sock, (const struct sockaddr*) &socketInfo, sizeof(socketInfo)) == -1) { fprintf(stderr, "cannot bind socket\n"); closeSocket(sock); quitSockets(); exit(EXIT_FAILURE); } if (setTimeout(sock, TIME_OUT) != 0) { fprintf(stderr, "cannot set socket timeout\n"); closeSocket(sock); quitSockets(); exit(EXIT_FAILURE); } int count = 0; int corruptCount = 0; int outOfOrderCount = 0; char buf[MAX_BLOCK_SIZE]; double recvStart = 0; int prevPacketNum = -1; while(1){ int result = recvfrom(sock, buf, MAX_BLOCK_SIZE, 0, NULL, NULL); if (result == -1) { //timed out if (count > 0) { double seconds = (getSeconds() - recvStart) - TIME_OUT; if (seconds < 0) { seconds = 0; } recvStart = 0; printf("blocks received: %d\n", count); printf("corrupted: %d\n", corruptCount); printf("out of order: %d\n", outOfOrderCount); printf("time to send (seconds): %f\n", seconds); count = 0; corruptCount = 0; outOfOrderCount = 0; prevPacketNum = -1; } } else { if (recvStart == 0) { recvStart = getSeconds(); } unsigned short checksum; memcpy(&checksum, buf, sizeof(short)); if (checksum == fletcherChecksum(buf+sizeof(short), result-sizeof(short))){ int packetNum; memcpy(&packetNum, buf + sizeof(short), sizeof(int)); if (packetNum != prevPacketNum+1) { outOfOrderCount++; } prevPacketNum = packetNum; } else { corruptCount++; } count++; } } closeSocket(sock); quitSockets(); exit(EXIT_SUCCESS); }