示例#1
0
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);  
}
示例#2
0
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);
}