Dependencies: XBeeLib mbed HvZAlphaNumLib HvZServerLib
lib/udp.cpp@1:d1b5cd8b2c18, 2010-12-12 (annotated)
- Committer:
- etherealflaim
- Date:
- Sun Dec 12 19:38:47 2010 +0000
- Revision:
- 1:d1b5cd8b2c18
- Parent:
- 0:9cdba0589ba2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
etherealflaim | 0:9cdba0589ba2 | 1 | #include "mbed.h" |
etherealflaim | 0:9cdba0589ba2 | 2 | #include "iHvZ.hpp" |
etherealflaim | 0:9cdba0589ba2 | 3 | #include "if/net/netudpsocket.h" |
etherealflaim | 0:9cdba0589ba2 | 4 | |
etherealflaim | 0:9cdba0589ba2 | 5 | #include "udp.hpp" |
etherealflaim | 0:9cdba0589ba2 | 6 | |
etherealflaim | 0:9cdba0589ba2 | 7 | UDP::UDP(iHvZ *game, PinName eth_in) |
etherealflaim | 0:9cdba0589ba2 | 8 | : m_game(game), m_eth(eth_in), m_eth_int(eth_in), |
etherealflaim | 0:9cdba0589ba2 | 9 | m_pNetUdpSocket(NULL), m_pCbItem(NULL), m_pCbMeth(NULL), m_pCb(NULL), |
etherealflaim | 1:d1b5cd8b2c18 | 10 | //conn(IpAddr(192,168,1,2),IpAddr(255,255,255,0), IpAddr(), IpAddr()) |
etherealflaim | 0:9cdba0589ba2 | 11 | { |
etherealflaim | 0:9cdba0589ba2 | 12 | // Set the game ID |
etherealflaim | 0:9cdba0589ba2 | 13 | char mac[8]; |
etherealflaim | 0:9cdba0589ba2 | 14 | char macaddr[12+1]; |
etherealflaim | 0:9cdba0589ba2 | 15 | eth.address(mac); |
etherealflaim | 0:9cdba0589ba2 | 16 | sprintf(macaddr, "%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
etherealflaim | 0:9cdba0589ba2 | 17 | m_game->id(macaddr); |
etherealflaim | 0:9cdba0589ba2 | 18 | |
etherealflaim | 0:9cdba0589ba2 | 19 | //m_eth_int.rise(this, &UDP::check); |
etherealflaim | 0:9cdba0589ba2 | 20 | m_eth_chk.attach(this, &UDP::check, 5); |
etherealflaim | 0:9cdba0589ba2 | 21 | registered = 0; |
etherealflaim | 0:9cdba0589ba2 | 22 | } |
etherealflaim | 0:9cdba0589ba2 | 23 | |
etherealflaim | 0:9cdba0589ba2 | 24 | UDP::~UDP() |
etherealflaim | 0:9cdba0589ba2 | 25 | { |
etherealflaim | 0:9cdba0589ba2 | 26 | close(); |
etherealflaim | 0:9cdba0589ba2 | 27 | } |
etherealflaim | 0:9cdba0589ba2 | 28 | |
etherealflaim | 0:9cdba0589ba2 | 29 | void UDP::check() |
etherealflaim | 0:9cdba0589ba2 | 30 | { |
etherealflaim | 0:9cdba0589ba2 | 31 | // debounce (if attached to a button) |
etherealflaim | 0:9cdba0589ba2 | 32 | wait(.1); |
etherealflaim | 0:9cdba0589ba2 | 33 | //if (m_eth) |
etherealflaim | 0:9cdba0589ba2 | 34 | //{ |
etherealflaim | 0:9cdba0589ba2 | 35 | // usb.printf("- Connection found, starting sync\r\n"); |
etherealflaim | 0:9cdba0589ba2 | 36 | ethlink(); |
etherealflaim | 0:9cdba0589ba2 | 37 | //} |
etherealflaim | 0:9cdba0589ba2 | 38 | m_eth_chk.attach(this, &UDP::check, 10); |
etherealflaim | 0:9cdba0589ba2 | 39 | } |
etherealflaim | 0:9cdba0589ba2 | 40 | |
etherealflaim | 0:9cdba0589ba2 | 41 | int UDP::sendto(const char* buf, int len, Host* pHost) |
etherealflaim | 0:9cdba0589ba2 | 42 | { |
etherealflaim | 0:9cdba0589ba2 | 43 | UDPErr udpSocketErr = checkInst(); |
etherealflaim | 0:9cdba0589ba2 | 44 | if(udpSocketErr) |
etherealflaim | 0:9cdba0589ba2 | 45 | return udpSocketErr; |
etherealflaim | 0:9cdba0589ba2 | 46 | return m_pNetUdpSocket->sendto(buf, len, pHost); |
etherealflaim | 0:9cdba0589ba2 | 47 | } |
etherealflaim | 0:9cdba0589ba2 | 48 | |
etherealflaim | 0:9cdba0589ba2 | 49 | int UDP::recvfrom(char* buf, int len, Host* pHost) |
etherealflaim | 0:9cdba0589ba2 | 50 | { |
etherealflaim | 0:9cdba0589ba2 | 51 | UDPErr udpSocketErr = checkInst(); |
etherealflaim | 0:9cdba0589ba2 | 52 | if(udpSocketErr) |
etherealflaim | 0:9cdba0589ba2 | 53 | return udpSocketErr; |
etherealflaim | 0:9cdba0589ba2 | 54 | return m_pNetUdpSocket->recvfrom(buf, len, pHost); |
etherealflaim | 0:9cdba0589ba2 | 55 | } |
etherealflaim | 0:9cdba0589ba2 | 56 | |
etherealflaim | 0:9cdba0589ba2 | 57 | UDPErr UDP::close() |
etherealflaim | 0:9cdba0589ba2 | 58 | { |
etherealflaim | 0:9cdba0589ba2 | 59 | if(!m_pNetUdpSocket) |
etherealflaim | 0:9cdba0589ba2 | 60 | return UDPSOCKET_SETUP; |
etherealflaim | 0:9cdba0589ba2 | 61 | m_pNetUdpSocket->resetOnEvent(); |
etherealflaim | 0:9cdba0589ba2 | 62 | UDPErr udpSocketErr = (UDPErr) m_pNetUdpSocket->close(); //Close (can already be closed) |
etherealflaim | 0:9cdba0589ba2 | 63 | Net::releaseUdpSocket(m_pNetUdpSocket); //And release it so it can be freed when properly removed |
etherealflaim | 0:9cdba0589ba2 | 64 | m_pNetUdpSocket = NULL; |
etherealflaim | 0:9cdba0589ba2 | 65 | return udpSocketErr; |
etherealflaim | 0:9cdba0589ba2 | 66 | } |
etherealflaim | 0:9cdba0589ba2 | 67 | |
etherealflaim | 0:9cdba0589ba2 | 68 | void UDP::ethlink() |
etherealflaim | 0:9cdba0589ba2 | 69 | { |
etherealflaim | 0:9cdba0589ba2 | 70 | Serial usb(USBTX,USBRX); |
etherealflaim | 0:9cdba0589ba2 | 71 | usb.printf("Checking for Ethernet connection...\r\n"); |
etherealflaim | 0:9cdba0589ba2 | 72 | |
etherealflaim | 1:d1b5cd8b2c18 | 73 | Host game_server(IpAddr(128, 61, 89, 71), HVZ_PORT, HVZ_HOSTNAME); |
etherealflaim | 1:d1b5cd8b2c18 | 74 | //Host game_server(IpAddr(192, 168, 1, 1), HVZ_PORT, HVZ_HOSTNAME); |
etherealflaim | 0:9cdba0589ba2 | 75 | |
etherealflaim | 0:9cdba0589ba2 | 76 | /* Function to call upon Server response */ |
etherealflaim | 0:9cdba0589ba2 | 77 | setOnEvent(this, &UDP::read); |
etherealflaim | 0:9cdba0589ba2 | 78 | |
etherealflaim | 0:9cdba0589ba2 | 79 | if( !eth.link() ) return; |
etherealflaim | 0:9cdba0589ba2 | 80 | usb.printf(" - Link active\r\n"); |
etherealflaim | 0:9cdba0589ba2 | 81 | |
etherealflaim | 0:9cdba0589ba2 | 82 | m_game->alphanumdisplay_device().display('*'); |
etherealflaim | 0:9cdba0589ba2 | 83 | |
etherealflaim | 0:9cdba0589ba2 | 84 | if( registered == 0 ) { |
etherealflaim | 0:9cdba0589ba2 | 85 | conn.setup(); |
etherealflaim | 0:9cdba0589ba2 | 86 | |
etherealflaim | 0:9cdba0589ba2 | 87 | //Get the MAC address of this device |
etherealflaim | 0:9cdba0589ba2 | 88 | eth.address((char *)mac.octet); |
etherealflaim | 0:9cdba0589ba2 | 89 | |
etherealflaim | 0:9cdba0589ba2 | 90 | // Send to Game Server until receive a response |
etherealflaim | 0:9cdba0589ba2 | 91 | // and wait for a response |
etherealflaim | 0:9cdba0589ba2 | 92 | do { |
etherealflaim | 0:9cdba0589ba2 | 93 | |
etherealflaim | 0:9cdba0589ba2 | 94 | register_device(mac, &game_server); |
etherealflaim | 0:9cdba0589ba2 | 95 | wait(0.1); |
etherealflaim | 0:9cdba0589ba2 | 96 | |
etherealflaim | 0:9cdba0589ba2 | 97 | Net::poll(); |
etherealflaim | 0:9cdba0589ba2 | 98 | |
etherealflaim | 0:9cdba0589ba2 | 99 | } while ( memcmp("i",&(srvr_resp[0]),1) ); |
etherealflaim | 0:9cdba0589ba2 | 100 | |
etherealflaim | 0:9cdba0589ba2 | 101 | printf("srvr_resp = %s\r\n", srvr_resp); |
etherealflaim | 0:9cdba0589ba2 | 102 | |
etherealflaim | 0:9cdba0589ba2 | 103 | // If the response is an acknowledgement |
etherealflaim | 0:9cdba0589ba2 | 104 | // get the IDs from the response and |
etherealflaim | 0:9cdba0589ba2 | 105 | // set the game device and tag IDs |
etherealflaim | 0:9cdba0589ba2 | 106 | if( get_ack_err(srvr_resp,HVZ_REG) ) { |
etherealflaim | 0:9cdba0589ba2 | 107 | set_ids(srvr_resp); |
etherealflaim | 0:9cdba0589ba2 | 108 | //printf( "deviceID = %s\r\n", m_game->id() ); |
etherealflaim | 0:9cdba0589ba2 | 109 | //printf( "tagID = %s\r\n", m_game->tagid() ); |
etherealflaim | 0:9cdba0589ba2 | 110 | |
etherealflaim | 0:9cdba0589ba2 | 111 | // Clear the response string |
etherealflaim | 0:9cdba0589ba2 | 112 | memset(srvr_resp,0,sizeof(srvr_resp)); |
etherealflaim | 0:9cdba0589ba2 | 113 | |
etherealflaim | 0:9cdba0589ba2 | 114 | // Upon registration there will be no tags or |
etherealflaim | 0:9cdba0589ba2 | 115 | // updates for this device, so just return here |
etherealflaim | 0:9cdba0589ba2 | 116 | return; |
etherealflaim | 0:9cdba0589ba2 | 117 | } |
etherealflaim | 0:9cdba0589ba2 | 118 | |
etherealflaim | 0:9cdba0589ba2 | 119 | // Set as already registered |
etherealflaim | 0:9cdba0589ba2 | 120 | registered = 1; |
etherealflaim | 0:9cdba0589ba2 | 121 | |
etherealflaim | 0:9cdba0589ba2 | 122 | // Clear the response string |
etherealflaim | 0:9cdba0589ba2 | 123 | memset(srvr_resp,0,sizeof(srvr_resp)); |
etherealflaim | 0:9cdba0589ba2 | 124 | } |
etherealflaim | 0:9cdba0589ba2 | 125 | |
etherealflaim | 0:9cdba0589ba2 | 126 | // Submit any tags to the server |
etherealflaim | 0:9cdba0589ba2 | 127 | // and wait for a response |
etherealflaim | 0:9cdba0589ba2 | 128 | do { |
etherealflaim | 0:9cdba0589ba2 | 129 | send_tag(&game_server, m_game->get_victims()); |
etherealflaim | 0:9cdba0589ba2 | 130 | wait(0.1); |
etherealflaim | 0:9cdba0589ba2 | 131 | |
etherealflaim | 0:9cdba0589ba2 | 132 | Net::poll(); |
etherealflaim | 0:9cdba0589ba2 | 133 | //} while ( memcmp("i",&(srvr_resp[0]),1) ); |
etherealflaim | 0:9cdba0589ba2 | 134 | } while ( 'i' != srvr_resp[0] ); |
etherealflaim | 0:9cdba0589ba2 | 135 | |
etherealflaim | 0:9cdba0589ba2 | 136 | printf("srvr_resp = %s\r\n", srvr_resp); |
etherealflaim | 0:9cdba0589ba2 | 137 | |
etherealflaim | 0:9cdba0589ba2 | 138 | // On successfully reporting tags to Server |
etherealflaim | 0:9cdba0589ba2 | 139 | // clear the tagged list |
etherealflaim | 0:9cdba0589ba2 | 140 | if( get_ack_err(srvr_resp,HVZ_TAG) ) |
etherealflaim | 0:9cdba0589ba2 | 141 | m_game->clear_victims(); |
etherealflaim | 0:9cdba0589ba2 | 142 | |
etherealflaim | 0:9cdba0589ba2 | 143 | // Clear the response string |
etherealflaim | 0:9cdba0589ba2 | 144 | memset(srvr_resp,0,sizeof(srvr_resp)); |
etherealflaim | 0:9cdba0589ba2 | 145 | |
etherealflaim | 0:9cdba0589ba2 | 146 | // Next request updates to the server |
etherealflaim | 0:9cdba0589ba2 | 147 | do { |
etherealflaim | 0:9cdba0589ba2 | 148 | // If the deviceID is set at update request |
etherealflaim | 0:9cdba0589ba2 | 149 | send_pull(&game_server); |
etherealflaim | 0:9cdba0589ba2 | 150 | |
etherealflaim | 0:9cdba0589ba2 | 151 | wait(0.1); |
etherealflaim | 0:9cdba0589ba2 | 152 | |
etherealflaim | 0:9cdba0589ba2 | 153 | Net::poll(); |
etherealflaim | 0:9cdba0589ba2 | 154 | //} while ( !srvr_resp[0] ); |
etherealflaim | 0:9cdba0589ba2 | 155 | } while ( 'i' != srvr_resp[0] ); |
etherealflaim | 0:9cdba0589ba2 | 156 | |
etherealflaim | 0:9cdba0589ba2 | 157 | printf("srvr_resp = %s\r\n", srvr_resp); |
etherealflaim | 0:9cdba0589ba2 | 158 | |
etherealflaim | 0:9cdba0589ba2 | 159 | // If pull request ack, update settings of the game |
etherealflaim | 0:9cdba0589ba2 | 160 | if( get_ack_err(srvr_resp,HVZ_PULL) ) |
etherealflaim | 0:9cdba0589ba2 | 161 | update_settings(srvr_resp); |
etherealflaim | 0:9cdba0589ba2 | 162 | |
etherealflaim | 0:9cdba0589ba2 | 163 | // Clear the response string |
etherealflaim | 0:9cdba0589ba2 | 164 | memset(srvr_resp,0,sizeof(srvr_resp)); |
etherealflaim | 0:9cdba0589ba2 | 165 | |
etherealflaim | 0:9cdba0589ba2 | 166 | // Display a completion mark |
etherealflaim | 0:9cdba0589ba2 | 167 | m_game->alphanumdisplay_device().display('^'); |
etherealflaim | 0:9cdba0589ba2 | 168 | wait(1); |
etherealflaim | 0:9cdba0589ba2 | 169 | m_game->alphanumdisplay_device().display(m_game->status()==STATUS_HUMAN?'H':'Z'); |
etherealflaim | 0:9cdba0589ba2 | 170 | } |
etherealflaim | 0:9cdba0589ba2 | 171 | |
etherealflaim | 0:9cdba0589ba2 | 172 | void UDP::read(UDPSocketEvent e) |
etherealflaim | 0:9cdba0589ba2 | 173 | { |
etherealflaim | 1:d1b5cd8b2c18 | 174 | Host host(IpAddr(128, 61, 89, 71), HVZ_PORT, HVZ_HOSTNAME); |
etherealflaim | 1:d1b5cd8b2c18 | 175 | //Host host(IpAddr(192, 168, 1, 1), HVZ_PORT, HVZ_HOSTNAME); |
etherealflaim | 0:9cdba0589ba2 | 176 | |
etherealflaim | 0:9cdba0589ba2 | 177 | if ( e == UDPSOCKET_READABLE ) |
etherealflaim | 0:9cdba0589ba2 | 178 | { |
etherealflaim | 0:9cdba0589ba2 | 179 | while( int len = recvfrom(srvr_resp, sizeof(srvr_resp), &host) ) |
etherealflaim | 0:9cdba0589ba2 | 180 | { |
etherealflaim | 0:9cdba0589ba2 | 181 | if( len <= 0 ) |
etherealflaim | 0:9cdba0589ba2 | 182 | break; |
etherealflaim | 0:9cdba0589ba2 | 183 | } |
etherealflaim | 0:9cdba0589ba2 | 184 | } |
etherealflaim | 0:9cdba0589ba2 | 185 | } |
etherealflaim | 0:9cdba0589ba2 | 186 | |
etherealflaim | 0:9cdba0589ba2 | 187 | void UDP::set_ids(char *response) |
etherealflaim | 0:9cdba0589ba2 | 188 | { |
etherealflaim | 0:9cdba0589ba2 | 189 | char buf[9]; |
etherealflaim | 0:9cdba0589ba2 | 190 | |
etherealflaim | 0:9cdba0589ba2 | 191 | /* First set the deviceID */ |
etherealflaim | 0:9cdba0589ba2 | 192 | memcpy(buf,response+13,8); |
etherealflaim | 0:9cdba0589ba2 | 193 | buf[8] = '\0'; |
etherealflaim | 0:9cdba0589ba2 | 194 | m_game->id(buf); |
etherealflaim | 0:9cdba0589ba2 | 195 | |
etherealflaim | 0:9cdba0589ba2 | 196 | /* Next set the tagID */ |
etherealflaim | 0:9cdba0589ba2 | 197 | memcpy(buf,response+22,8); |
etherealflaim | 0:9cdba0589ba2 | 198 | buf[8] = '\0'; |
etherealflaim | 0:9cdba0589ba2 | 199 | m_game->life(buf); |
etherealflaim | 0:9cdba0589ba2 | 200 | |
etherealflaim | 0:9cdba0589ba2 | 201 | m_game->save(); |
etherealflaim | 0:9cdba0589ba2 | 202 | } |
etherealflaim | 0:9cdba0589ba2 | 203 | |
etherealflaim | 0:9cdba0589ba2 | 204 | void UDP::update_settings(char *response) |
etherealflaim | 0:9cdba0589ba2 | 205 | { |
etherealflaim | 0:9cdba0589ba2 | 206 | char *tok; |
etherealflaim | 0:9cdba0589ba2 | 207 | // Clear the lives so we can add them all back |
etherealflaim | 0:9cdba0589ba2 | 208 | m_game->clear_lives(); |
etherealflaim | 0:9cdba0589ba2 | 209 | |
etherealflaim | 0:9cdba0589ba2 | 210 | // Start tokenizing the response |
etherealflaim | 0:9cdba0589ba2 | 211 | tok = strtok(response,"\001"); |
etherealflaim | 0:9cdba0589ba2 | 212 | |
etherealflaim | 0:9cdba0589ba2 | 213 | typedef enum { RNONE,RDEV,RLIVES,RSTUN,RINC } readtype; |
etherealflaim | 0:9cdba0589ba2 | 214 | readtype type = RNONE; |
etherealflaim | 0:9cdba0589ba2 | 215 | |
etherealflaim | 0:9cdba0589ba2 | 216 | while (tok != NULL) |
etherealflaim | 0:9cdba0589ba2 | 217 | { |
etherealflaim | 0:9cdba0589ba2 | 218 | //printf ("%s\r\n",tok); |
etherealflaim | 0:9cdba0589ba2 | 219 | tok = strtok (NULL, "\001"); |
etherealflaim | 0:9cdba0589ba2 | 220 | |
etherealflaim | 0:9cdba0589ba2 | 221 | if( strcmp(tok,"deviceid") == 0 ) { |
etherealflaim | 0:9cdba0589ba2 | 222 | type = RDEV; |
etherealflaim | 0:9cdba0589ba2 | 223 | continue; |
etherealflaim | 0:9cdba0589ba2 | 224 | } |
etherealflaim | 0:9cdba0589ba2 | 225 | |
etherealflaim | 0:9cdba0589ba2 | 226 | else if( strcmp(tok,"tagids") == 0 ) { |
etherealflaim | 0:9cdba0589ba2 | 227 | type = RLIVES; |
etherealflaim | 0:9cdba0589ba2 | 228 | continue; |
etherealflaim | 0:9cdba0589ba2 | 229 | } |
etherealflaim | 0:9cdba0589ba2 | 230 | |
etherealflaim | 0:9cdba0589ba2 | 231 | else if( strcmp(tok,"stuntime") == 0 ) { |
etherealflaim | 0:9cdba0589ba2 | 232 | type = RSTUN; |
etherealflaim | 0:9cdba0589ba2 | 233 | continue; |
etherealflaim | 0:9cdba0589ba2 | 234 | } |
etherealflaim | 0:9cdba0589ba2 | 235 | |
etherealflaim | 0:9cdba0589ba2 | 236 | else if( strcmp(tok,"incubate") == 0 ) { |
etherealflaim | 0:9cdba0589ba2 | 237 | type = RINC; |
etherealflaim | 0:9cdba0589ba2 | 238 | continue; |
etherealflaim | 0:9cdba0589ba2 | 239 | } |
etherealflaim | 0:9cdba0589ba2 | 240 | |
etherealflaim | 0:9cdba0589ba2 | 241 | switch (type) |
etherealflaim | 0:9cdba0589ba2 | 242 | { |
etherealflaim | 0:9cdba0589ba2 | 243 | case RDEV: |
etherealflaim | 0:9cdba0589ba2 | 244 | m_game->id(tok); |
etherealflaim | 0:9cdba0589ba2 | 245 | break; |
etherealflaim | 0:9cdba0589ba2 | 246 | case RLIVES: |
etherealflaim | 0:9cdba0589ba2 | 247 | m_game->life(tok); |
etherealflaim | 0:9cdba0589ba2 | 248 | continue; // possibility of more than one |
etherealflaim | 0:9cdba0589ba2 | 249 | case RSTUN: |
etherealflaim | 0:9cdba0589ba2 | 250 | m_game->stun_duration((unsigned)atoi(tok)); |
etherealflaim | 0:9cdba0589ba2 | 251 | break; |
etherealflaim | 0:9cdba0589ba2 | 252 | case RINC: |
etherealflaim | 0:9cdba0589ba2 | 253 | m_game->incubation_time((unsigned)atoi(tok)); |
etherealflaim | 0:9cdba0589ba2 | 254 | break; |
etherealflaim | 0:9cdba0589ba2 | 255 | } |
etherealflaim | 0:9cdba0589ba2 | 256 | |
etherealflaim | 0:9cdba0589ba2 | 257 | // go back to no parsing |
etherealflaim | 0:9cdba0589ba2 | 258 | type = RNONE; |
etherealflaim | 0:9cdba0589ba2 | 259 | } |
etherealflaim | 0:9cdba0589ba2 | 260 | |
etherealflaim | 0:9cdba0589ba2 | 261 | m_game->save(); |
etherealflaim | 0:9cdba0589ba2 | 262 | } |
etherealflaim | 0:9cdba0589ba2 | 263 | |
etherealflaim | 0:9cdba0589ba2 | 264 | void UDP::send_pull(Host *host) |
etherealflaim | 0:9cdba0589ba2 | 265 | { |
etherealflaim | 0:9cdba0589ba2 | 266 | char data[64]; |
etherealflaim | 0:9cdba0589ba2 | 267 | // char buff[12]; |
etherealflaim | 0:9cdba0589ba2 | 268 | // |
etherealflaim | 0:9cdba0589ba2 | 269 | // memset(data,0,sizeof(data)); |
etherealflaim | 0:9cdba0589ba2 | 270 | |
etherealflaim | 0:9cdba0589ba2 | 271 | // if( type == PULL_DEV ) |
etherealflaim | 0:9cdba0589ba2 | 272 | // sprintf(buff, "%c%c%c%c%c%c%c%c", pullId[0], pullId[1], pullId[2], |
etherealflaim | 0:9cdba0589ba2 | 273 | // pullId[3], pullId[4], pullId[5], pullId[6], pullId[7]); |
etherealflaim | 0:9cdba0589ba2 | 274 | |
etherealflaim | 0:9cdba0589ba2 | 275 | // else |
etherealflaim | 0:9cdba0589ba2 | 276 | // sprintf(buff, "%02X%02X%02X%02X%02X%02X", pullId[0], pullId[1], pullId[2], |
etherealflaim | 0:9cdba0589ba2 | 277 | // pullId[3], pullId[4], pullId[5]); |
etherealflaim | 0:9cdba0589ba2 | 278 | |
etherealflaim | 0:9cdba0589ba2 | 279 | // strcat(data, "iHvZ\001pull\001"); |
etherealflaim | 0:9cdba0589ba2 | 280 | // strcat(data, buff); |
etherealflaim | 0:9cdba0589ba2 | 281 | // strcat(data, "\001end"); |
etherealflaim | 0:9cdba0589ba2 | 282 | |
etherealflaim | 0:9cdba0589ba2 | 283 | sprintf(data, "iHvZ\001pull\001%s\001end", m_game->id().c_str()); |
etherealflaim | 0:9cdba0589ba2 | 284 | |
etherealflaim | 0:9cdba0589ba2 | 285 | sendto(data, strlen(data), host); |
etherealflaim | 0:9cdba0589ba2 | 286 | } |
etherealflaim | 0:9cdba0589ba2 | 287 | |
etherealflaim | 0:9cdba0589ba2 | 288 | inline void UDP::send_tag(Host *host, vector<string> taggedIDs) |
etherealflaim | 0:9cdba0589ba2 | 289 | { |
etherealflaim | 0:9cdba0589ba2 | 290 | int totalsize = 32; |
etherealflaim | 0:9cdba0589ba2 | 291 | |
etherealflaim | 0:9cdba0589ba2 | 292 | for (int i = 0; i < taggedIDs.size(); i++) |
etherealflaim | 0:9cdba0589ba2 | 293 | { |
etherealflaim | 0:9cdba0589ba2 | 294 | totalsize += taggedIDs[i].size(); |
etherealflaim | 0:9cdba0589ba2 | 295 | } |
etherealflaim | 0:9cdba0589ba2 | 296 | |
etherealflaim | 0:9cdba0589ba2 | 297 | char tmp[totalsize]; |
etherealflaim | 0:9cdba0589ba2 | 298 | |
etherealflaim | 0:9cdba0589ba2 | 299 | // Clear out buffers |
etherealflaim | 0:9cdba0589ba2 | 300 | memset(tmp, 0, sizeof(tmp)); |
etherealflaim | 0:9cdba0589ba2 | 301 | |
etherealflaim | 0:9cdba0589ba2 | 302 | // Append tagIDs |
etherealflaim | 0:9cdba0589ba2 | 303 | for (int i = 0; i < taggedIDs.size(); i++) |
etherealflaim | 0:9cdba0589ba2 | 304 | { |
etherealflaim | 0:9cdba0589ba2 | 305 | strcat(tmp, taggedIDs[i].c_str()); |
etherealflaim | 0:9cdba0589ba2 | 306 | strcat(tmp, "\001"); |
etherealflaim | 0:9cdba0589ba2 | 307 | } |
etherealflaim | 0:9cdba0589ba2 | 308 | string tagids = tmp; |
etherealflaim | 0:9cdba0589ba2 | 309 | |
etherealflaim | 0:9cdba0589ba2 | 310 | sprintf(tmp, "iHvZ\001tag\001%s\001%send", m_game->id().c_str(), tagids.c_str()); |
etherealflaim | 0:9cdba0589ba2 | 311 | |
etherealflaim | 0:9cdba0589ba2 | 312 | sendto(tmp, strlen(tmp), host); |
etherealflaim | 0:9cdba0589ba2 | 313 | } |
etherealflaim | 0:9cdba0589ba2 | 314 | |
etherealflaim | 0:9cdba0589ba2 | 315 | void UDP::resetOnEvent() //Disable callback |
etherealflaim | 0:9cdba0589ba2 | 316 | { |
etherealflaim | 0:9cdba0589ba2 | 317 | m_pCb = NULL; |
etherealflaim | 0:9cdba0589ba2 | 318 | m_pCbItem = NULL; |
etherealflaim | 0:9cdba0589ba2 | 319 | m_pCbMeth = NULL; |
etherealflaim | 0:9cdba0589ba2 | 320 | } |
etherealflaim | 0:9cdba0589ba2 | 321 | |
etherealflaim | 0:9cdba0589ba2 | 322 | void UDP::onNetUdpSocketEvent(NetUdpSocketEvent e) |
etherealflaim | 0:9cdba0589ba2 | 323 | { |
etherealflaim | 0:9cdba0589ba2 | 324 | if(m_pCbItem && m_pCbMeth) |
etherealflaim | 0:9cdba0589ba2 | 325 | (m_pCbItem->*m_pCbMeth)((UDPSocketEvent) e); |
etherealflaim | 0:9cdba0589ba2 | 326 | else if(m_pCb) |
etherealflaim | 0:9cdba0589ba2 | 327 | m_pCb((UDPSocketEvent) e); |
etherealflaim | 0:9cdba0589ba2 | 328 | } |
etherealflaim | 0:9cdba0589ba2 | 329 | |
etherealflaim | 0:9cdba0589ba2 | 330 | UDPErr UDP::checkInst() |
etherealflaim | 0:9cdba0589ba2 | 331 | { |
etherealflaim | 0:9cdba0589ba2 | 332 | if(!m_pNetUdpSocket) |
etherealflaim | 0:9cdba0589ba2 | 333 | { |
etherealflaim | 0:9cdba0589ba2 | 334 | m_pNetUdpSocket = Net::udpSocket(); |
etherealflaim | 0:9cdba0589ba2 | 335 | if(!m_pNetUdpSocket) |
etherealflaim | 0:9cdba0589ba2 | 336 | { |
etherealflaim | 0:9cdba0589ba2 | 337 | return UDPSOCKET_IF; //Interface did not return a socket (usually because a default interface does not exist) |
etherealflaim | 0:9cdba0589ba2 | 338 | } |
etherealflaim | 0:9cdba0589ba2 | 339 | m_pNetUdpSocket->setOnEvent(this, &UDP::onNetUdpSocketEvent); |
etherealflaim | 0:9cdba0589ba2 | 340 | } |
etherealflaim | 0:9cdba0589ba2 | 341 | return UDPSOCKET_OK; |
etherealflaim | 0:9cdba0589ba2 | 342 | } |