/* This will presumably be modified by you. It is here to provide an example of how to open a UDP port. You might choose to use a different strategy */ void netInit() { bool joinGame(); Sockaddr nullAddr; Sockaddr *thisHost; char buf[128]; int reuse; u_char ttl; struct ip_mreq mreq; /* MAZEPORT will be assigned by the TA to each team */ M->mazePortIs(htons(MAZEPORT)); gethostname(buf, sizeof(buf)); if ((thisHost = resolveHost(buf)) == (Sockaddr *) NULL) MWError("who am I?"); bcopy((caddr_t) thisHost, (caddr_t) (M->myAddr()), sizeof(Sockaddr)); M->theSocketIs(socket(AF_INET, SOCK_DGRAM, 0)); if (M->theSocket() < 0) MWError("can't get socket"); /* SO_REUSEADDR allows more than one binding to the same socket - you cannot have more than one player on one machine without this */ reuse = 1; if (setsockopt(M->theSocket(), SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { MWError("setsockopt failed (SO_REUSEADDR)"); } nullAddr.sin_family = AF_INET; nullAddr.sin_addr.s_addr = htonl(INADDR_ANY); nullAddr.sin_port = M->mazePort(); if (bind(M->theSocket(), (struct sockaddr *)&nullAddr, sizeof(nullAddr)) < 0) MWError("netInit binding"); /* Multicast TTL: 0 restricted to the same host 1 restricted to the same subnet 32 restricted to the same site 64 restricted to the same region 128 restricted to the same continent 255 unrestricted DO NOT use a value > 32. If possible, use a value of 1 when testing. */ ttl = 32; if (setsockopt(M->theSocket(), IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) { MWError("setsockopt failed (IP_MULTICAST_TTL)"); } /* uncomment the following if you do not want to receive messages that you sent out - of course, you cannot have multiple players on the same machine if you do this */ #if 0 { u_char loop = 0; if (setsockopt(M->theSocket(), IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) < 0) { MWError("setsockopt failed (IP_MULTICAST_LOOP)"); } } #endif /* join the multicast group */ mreq.imr_multiaddr.s_addr = htonl(MAZEGROUP); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(M->theSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) < 0) { MWError("setsockopt failed (IP_ADD_MEMBERSHIP)"); } /* * Now we can try to find a game to join; if none, start one. */ /* I haven't implemented joinGame or startGame in this sample */ /* if (!joinGame()) startGame(); */ printf("\n"); /* set up some stuff strictly for this local sample */ M->myRatIdIs(0); M->scoreIs(0); SetMyRatIndexType(0); /* Get the multi-cast address ready to use in SendData() calls. */ memcpy(&groupAddr, &nullAddr, sizeof(Sockaddr)); groupAddr.sin_addr.s_addr = htonl(MAZEGROUP); mws_set_addr(M->state, (struct sockaddr *)&groupAddr, M->theSocket()); }
void netInit() { Sockaddr nullAddr; Sockaddr *thisHost; char buf[128]; int reuse; u_char ttl; struct ip_mreq mreq; /* MAZEPORT will be assigned by the TA to each team */ M->mazePortIs(htons(MAZEPORT)); gethostname(buf, sizeof(buf)); if ((thisHost = resolveHost(buf)) == (Sockaddr *) NULL) MWError("who am I?"); bcopy((caddr_t) thisHost, (caddr_t) (M->myAddr()), sizeof(Sockaddr)); M->theSocketIs(socket(AF_INET, SOCK_DGRAM, 0)); if (M->theSocket() < 0) MWError("can't get socket"); /* SO_REUSEADDR allows more than one binding to the same socket - you cannot have more than one player on one machine without this */ reuse = 1; if (setsockopt(M->theSocket(), SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { MWError("setsockopt failed (SO_REUSEADDR)"); } nullAddr.sin_family = AF_INET; nullAddr.sin_addr.s_addr = htonl(INADDR_ANY); nullAddr.sin_port = M->mazePort(); if (bind(M->theSocket(), (struct sockaddr *)&nullAddr, sizeof(nullAddr)) < 0) MWError("netInit binding"); /* Multicast TTL: 0 restricted to the same host 1 restricted to the same subnet 32 restricted to the same site 64 restricted to the same region 128 restricted to the same continent 255 unrestricted DO NOT use a value > 32. If possible, use a value of 1 when testing. */ ttl = 1; if (setsockopt(M->theSocket(), IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) { MWError("setsockopt failed (IP_MULTICAST_TTL)"); } /* join the multicast group */ mreq.imr_multiaddr.s_addr = htonl(MAZEGROUP); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(M->theSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq)) < 0) { MWError("setsockopt failed (IP_ADD_MEMBERSHIP)"); } /* * Now we can try to find a game to join; if none, start one. */ printf("\n"); /* set up some stuff strictly for this local sample */ //int temp = rand()%8;/*FIXME- REALLY REALLY RANDOM*/ M->myRatIdIs(0); // FIXME //M->rat(M->myRatId().value()).playing=true; //cout << M->myRatId().value() << endl; //cout << temp << endl; M->scoreIs(0); SetMyRatIndexType(0); /* Get the multi-cast address ready to use in SendData() calls. */ memcpy(&groupAddr, &nullAddr, sizeof(Sockaddr)); groupAddr.sin_addr.s_addr = htonl(MAZEGROUP); }