home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / vmsnet.sources.games / vmsnetrek / part42 < prev    next >
Text File  |  1992-11-20  |  15KB  |  503 lines

  1. Newsgroups: vmsnet.sources.games
  2. Path: uunet!zaphod.mps.ohio-state.edu!rpi!usenet.coe.montana.edu!news.uoregon.edu!news.u.washington.edu!raven.alaska.edu!acad2.alaska.edu!asdmf
  3. From: asdmf@acad2.alaska.edu
  4. Subject: Vmsnetrek 42/47
  5. Message-ID: <1992Nov20.210123.1@acad2.alaska.edu>
  6. Lines: 490
  7. Sender: news@raven.alaska.edu (USENET News System)
  8. Nntp-Posting-Host: acad2.alaska.edu
  9. Organization: University of Alaska
  10. Date: Sat, 21 Nov 1992 01:01:23 GMT
  11. Xref: uunet vmsnet.sources.games:542
  12.  
  13. -+-+-+-+-+-+-+-+ START OF PART 42 -+-+-+-+-+-+-+-+
  14. X`009`009UDPDIAG(("Connected to server's UDP port\n"));
  15. X`009`009commStatus = STAT_VERIFY_UDP;
  16. X`009`009if (udpWin)
  17. X`009`009    udprefresh(UDP_STATUS);
  18. X`009`009response.request = COMM_VERIFY;`009/* send verify request on UDP */
  19. X`009`009response.port = 0;
  20. X`009`009commSwitchTimeout = 25;`009/* wait 25 updates */
  21. Xsend:
  22. X`009`009sendServerPacket(&response);
  23. X`009    `125
  24. X`009`125
  25. X
  26. X`009break;
  27. X    case SWITCH_DENIED:
  28. X`009if (ntohs(packet->port)) `123
  29. X`009    UDPDIAG(("Switch to UDP failed (different version)\n"));
  30. X`009    warning("UDP protocol request failed (bad version)");
  31. X`009`125 else `123
  32. X`009    UDPDIAG(("Switch to UDP denied\n"));
  33. X`009    warning("UDP protocol request denied");
  34. X`009`125
  35. X`009commModeReq = commMode;
  36. X`009commStatus = STAT_CONNECTED;
  37. X`009commSwitchTimeout = 0;
  38. X`009if (udpWin)
  39. X`009    udprefresh(UDP_STATUS);
  40. X`009if (udpSock >= 0)
  41. X`009    closeUdpConn();
  42. X`009break;
  43. X    case SWITCH_VERIFY:
  44. X`009UDPDIAG(("Received UDP verification\n"));
  45. X`009break;
  46. X    default:
  47. X`009fprintf(stderr, "netrek: Got funny reply (%d) in UDP_REPLY packet\n",
  48. X`009`009packet->reply);
  49. X`009break;
  50. X    `125
  51. X`125
  52. X
  53. X#define MAX_PORT_RETRY`00910
  54. XopenUdpConn()
  55. X`123
  56. X    struct sockaddr_in addr;
  57. X    struct hostent *hp;
  58. X    int attempts;
  59. X
  60. X    if (udpSock >= 0) `123
  61. X`009fprintf(stderr, "netrek: tried to open udpSock twice\n");
  62. X`009return (0);`009/* pretend we succeeded (this could be bad) */
  63. X    `125
  64. X
  65. X    if ((udpSock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) `123
  66. X`009perror("netrek: unable to create DGRAM socket");
  67. X`009return (-1);
  68. X    `125
  69. X
  70. X    addr.sin_addr.s_addr = INADDR_ANY;
  71. X    addr.sin_family = AF_INET;
  72. X
  73. X    errno = 0;
  74. X    udpLocalPort = (getpid() & 32767) + (random() % 256);
  75. X    for (attempts = 0; attempts < MAX_PORT_RETRY; attempts++) `123
  76. X`009while (udpLocalPort < 2048) `123
  77. X`009    udpLocalPort = (udpLocalPort + 10687) & 32767;
  78. X`009`125
  79. X#ifdef GATEWAY
  80. X`009/* we need the gateway to know where to find us */
  81. X`009if (!strcmp(serverName, gw_mach)) `123
  82. X`009    UDPDIAG(("+ gateway test: binding to %d\n", gw_local_port));
  83. X`009    udpLocalPort = gw_local_port;
  84. X`009`125
  85. X#endif
  86. X`009addr.sin_port = htons(udpLocalPort);
  87. X`009if (bind(udpSock, &addr, sizeof(addr)) >= 0)
  88. X`009    break;
  89. X    `125
  90. X    if (attempts == MAX_PORT_RETRY) `123
  91. X`009perror("netrek: bind");
  92. X`009UDPDIAG(("Unable to find a local port to bind to\n"));
  93. X`009close(udpSock);
  94. X`009udpSock = -1;
  95. X`009return (-1);
  96. X    `125
  97. X
  98. X    UDPDIAG(("Local port is %d\n", udpLocalPort));
  99. X
  100. X    /* determine the address of the server */
  101. X    if (!serveraddr) `123
  102. X`009if ((addr.sin_addr.s_addr = inet_addr(serverName)) == -1) `123
  103. X`009    if ((hp = gethostbyname(serverName)) == NULL) `123
  104. X`009`009printf("Who is %s?\n", serverName);
  105. X`009`009exit(0);
  106. X`009    `125 else `123
  107. X`009`009addr.sin_addr.s_addr = *(long *) hp->h_addr;
  108. X`009    `125
  109. X`009`125
  110. X`009serveraddr = addr.sin_addr.s_addr;
  111. X`009UDPDIAG(("Found serveraddr == 0x%x\n", serveraddr));
  112. X    `125
  113. X    return (0);
  114. X`125
  115. X
  116. X#ifdef USE_PORTSWAP
  117. XconnUdpConn()
  118. X`123
  119. X    struct sockaddr_in addr;
  120. X
  121. X    addr.sin_addr.s_addr = serveraddr;
  122. X    addr.sin_family = AF_INET;
  123. X    addr.sin_port = htons(udpServerPort);
  124. X
  125. X    UDPDIAG(("Connecting to host 0x%x on port %d\n", serveraddr,udpServerPor
  126. Vt));
  127. X    if (connect(udpSock, &addr, sizeof(addr)) < 0) `123
  128. X`009fprintf(stderr, "Error %d: ");
  129. X`009perror("netrek: unable to connect UDP socket");
  130. X`009printUdpInfo();`009`009/* debug */
  131. X`009return (-1);
  132. X    `125
  133. X
  134. X    return (0);
  135. X`125
  136. X#endif
  137. X
  138. X#ifndef USE_PORTSWAP
  139. XrecvUdpConn()
  140. X`123
  141. X    fd_set readfds;
  142. X    struct timeval to;
  143. X    struct sockaddr_in from;
  144. X    struct sockaddr_in addr;
  145. X    int fromlen, res;
  146. X
  147. X    bzero(&from, sizeof(from));`009`009/* don't get garbage if really broken
  148. V */
  149. X
  150. X    /* we patiently wait until the server sends a packet to us */
  151. X    /* (note that we silently eat the first one) */
  152. X    UDPDIAG(("Issuing recvfrom() call\n"));
  153. X    printUdpInfo();
  154. X    fromlen = sizeof(from);
  155. X    FD_ZERO(&readfds);
  156. X    FD_SET(udpSock, &readfds);
  157. X    to.tv_sec = 6;`009`009/* wait 6 seconds, then abort */
  158. X    to.tv_usec = 0;
  159. X    if ((res = select(32, &readfds, 0, 0, &to)) <= 0) `123
  160. X`009if (!res) `123
  161. X`009    UDPDIAG(("timed out waiting for response\n"));
  162. X`009    warning("UDP connection request timed out");
  163. X`009    return (-1);
  164. X`009`125 else `123
  165. X`009    perror("select() before recvfrom()");
  166. X`009    return (-1);
  167. X`009`125
  168. X    `125
  169. X    if (recvfrom(udpSock, buf, BUFSIZ, 0, &from, &fromlen) < 0) `123
  170. X        perror("recvfrom");
  171. X`009UDPDIAG(("recvfrom failed, aborting UDP attempt"));
  172. X`009return (-1);
  173. X    `125
  174. X
  175. X    if (from.sin_addr.s_addr != serveraddr) `123
  176. X`009UDPDIAG(("Warning: from 0x%x, but server is 0x%x\n",
  177. X`009`009from.sin_addr.s_addr, serveraddr));
  178. X    `125
  179. X    if (from.sin_family != AF_INET) `123
  180. X`009UDPDIAG(("Warning: not AF_INET (%d)\n", from.sin_family));
  181. X    `125
  182. X    udpServerPort = ntohs(from.sin_port);
  183. X    UDPDIAG(("recvfrom() succeeded; will use server port %d\n", udpServerPor
  184. Vt));
  185. X#ifdef GATEWAY
  186. X    if (!strcmp(serverName, gw_mach)) `123
  187. X`009UDPDIAG(("+ actually, I'm going to use %d\n", gw_port));
  188. X`009udpServerPort = gw_port;
  189. X`009from.sin_port = htons(udpServerPort);
  190. X    `125
  191. X#endif
  192. X
  193. X    if (connect(udpSock, &from, sizeof(from)) < 0) `123
  194. X`009perror("netrek: unable to connect UDP socket after recvfrom()");
  195. X`009close(udpSock);
  196. X`009udpSock = -1;
  197. X`009return (-1);
  198. X    `125
  199. X
  200. X    return (0);
  201. X`125
  202. X#endif
  203. X
  204. XcloseUdpConn()
  205. X`123
  206. X    V_UDPDIAG(("Closing UDP socket\n"));
  207. X    if (udpSock < 0) `123
  208. X`009fprintf(stderr, "netrek: tried to close a closed UDP socket\n");
  209. X`009return (-1);
  210. X    `125
  211. X    shutdown(udpSock, 2);
  212. X    close(udpSock);
  213. X    udpSock = -1;
  214. X`125
  215. X
  216. X/* debugging info */
  217. XprintUdpInfo()
  218. X`123
  219. X    struct sockaddr_in addr;
  220. X    int len;
  221. X
  222. X    len = sizeof(addr);
  223. X    if (getsockname(udpSock, &addr, &len) < 0) `123
  224. X/*`009perror("printUdpInfo: getsockname");*/
  225. X`009return;
  226. X    `125
  227. X    UDPDIAG(("LOCAL: addr=0x%x, family=%d, port=%d\n", addr.sin_addr.s_addr,
  228. X`009addr.sin_family, ntohs(addr.sin_port)));
  229. X
  230. X    if (getpeername(udpSock, &addr, &len) < 0) `123
  231. X/*`009perror("printUdpInfo: getpeername");*/
  232. X`009return;
  233. X    `125
  234. X    UDPDIAG(("PEER : addr=0x%x, family=%d, port=%d\n", addr.sin_addr.s_addr,
  235. X`009addr.sin_family, ntohs(addr.sin_port)));
  236. X`125
  237. X
  238. X/* handles both SP_SEQUENCE and SP_SC_SEQUENCE */
  239. XhandleSequence(packet)
  240. Xstruct sequence_spacket *packet;
  241. X`123
  242. X    static int recent_count=0, recent_dropped=0;
  243. X    long newseq;
  244. X
  245. X    drop_flag = 0;
  246. X    if (chan != udpSock)
  247. X`009return;`009`009/* don't pay attention to TCP sequence #s */
  248. X
  249. X    udpTotal++;
  250. X    recent_count++;
  251. X
  252. X    /* update percent display every 256 updates (`12650 seconds usually) */
  253. X    if (!(udpTotal & 0xff))
  254. X`009if (udpWin) udprefresh(UDP_DROPPED);
  255. X
  256. X    newseq = (long) ntohs(packet->sequence);
  257. X/*    printf("read %d - ", newseq);*/
  258. X
  259. X    if (((unsigned short) sequence) > 65000 &&
  260. X`009((unsigned short) newseq) < 1000) `123
  261. X`009/* we rolled, set newseq = 65536+sequence and accept it */
  262. X`009sequence = ((sequence + 65536) & 0xffff0000) `124 newseq;
  263. X    `125 else `123
  264. X`009/* adjust newseq and do compare */
  265. X`009newseq `124= (sequence & 0xffff0000);
  266. X
  267. X`009if (!udpSequenceChk) `123`009/* put this here so that turning seq check
  268. V */
  269. X`009    sequence = newseq;`009/* on and off doesn't make us think we lost */
  270. X`009    return;`009`009/* a whole bunch of packets. */
  271. X`009`125
  272. X
  273. X`009if (newseq > sequence) `123
  274. X`009    /* accept */
  275. X`009    if (newseq != sequence+1) `123
  276. X`009`009udpDropped += (newseq-sequence)-1;
  277. X`009`009udpTotal += (newseq-sequence)-1;`009/* want TOTAL packets */
  278. X`009`009recent_dropped += (newseq-sequence)-1;
  279. X`009`009recent_count += (newseq-sequence)-1;
  280. X`009`009if (udpWin)
  281. X`009`009    udprefresh(UDP_DROPPED);
  282. X`009`009UDPDIAG(("sequence=%d, newseq=%d, we lost some\n",
  283. X`009`009    sequence, newseq));
  284. X`009    `125
  285. X`009    sequence = newseq;
  286. X`009`125 else `123
  287. X`009    /* reject */
  288. X`009    if (packet->type == SP_SC_SEQUENCE) `123
  289. X`009`009V_UDPDIAG(("(ignoring repeat %d)\n", newseq));
  290. X`009    `125 else `123
  291. X`009`009UDPDIAG(("sequence=%d, newseq=%d, ignoring transmission\n",
  292. X`009`009    sequence, newseq));
  293. X`009    `125
  294. X`009    drop_flag = 1;
  295. X`009`125
  296. X    `125
  297. X/*    printf("newseq %d, sequence %d\n", newseq, sequence);*/
  298. X
  299. X    if (recent_count > UDP_RECENT_INTR) `123
  300. X`009/* once a minute (at 5 upd/sec), report on how many were dropped */
  301. X`009/* during the last UDP_RECENT_INTR updates                       */
  302. X`009udpRecentDropped = recent_dropped;
  303. X`009recent_count = recent_dropped = 0;
  304. X`009if (udpWin)
  305. X`009    udprefresh(UDP_DROPPED);
  306. X    `125
  307. X`125
  308. X
  309. $ CALL UNPACK SOCKET.C;1 643885165
  310. $ create/nolog 'f'
  311. X/*
  312. X * stats.c
  313. X */
  314. X#include "copyright.h"
  315. X
  316. X#include <stdio.h>
  317. X#include "Wlib.h"
  318. X#include "defs.h"
  319. X#include "struct.h"
  320. X#include "data.h"
  321. X
  322. X#define`009MIN(a,b)`009(((a) < (b)) ? (a) : (b))
  323. X
  324. X#define`009BX_OFF()`009((textWidth + 1) * W_Textwidth + S_IBORDER)
  325. X#define`009BY_OFF(line)`009((line) * (W_Textheight + S_IBORDER) + S_IBORDER)
  326. X#define`009TX_OFF(len)`009((textWidth - len) * W_Textwidth + S_IBORDER)
  327. X#define`009TY_OFF(line)`009BY_OFF(line)
  328. X
  329. X#define STAT_WIDTH`009`009160
  330. X#define STAT_HEIGHT`009`009BY_OFF(NUM_SLIDERS)
  331. X#define STAT_BORDER`009`0092
  332. X#define S_IBORDER`009`0095
  333. X#define STAT_X`009`009`009422
  334. X#define STAT_Y`009`009`00913
  335. X
  336. X#define SL_WID`009`009`009\
  337. X`009(STAT_WIDTH - 2 * S_IBORDER - (textWidth + 1) * W_Textwidth)
  338. X#define SL_HEI`009`009`009(W_Textheight)
  339. X
  340. X#define NUM_ELS(a)`009`009(sizeof (a) / sizeof (*(a)))
  341. X#define NUM_SLIDERS`009`009NUM_ELS(sliders)
  342. X
  343. Xtypedef struct slider `123
  344. X`009char`009*label;
  345. X`009int`009min, max;
  346. X`009int`009low_red, high_red;
  347. X`009int`009label_length;
  348. X`009int`009diff;
  349. X`009int`009*var;
  350. X`009int`009lastVal;
  351. X`125 SLIDER;
  352. X
  353. Xtypedef struct record `123
  354. X`009int`009*data;
  355. X`009int`009last_value;
  356. X`125 RECORD;
  357. X
  358. Xstatic SLIDER`009sliders`091`093 = `123
  359. X`009`123 "Shields",`009`0090,`009100,`00920,`009100`009`125,
  360. X`009`123 "Damage",`009`0090,`009100,`0090,`0090`009`125,
  361. X`009`123 "Fuel",`009`0090,`00910000,`0092000,`00910000`009`125,
  362. X`009`123 "Warp",`009`0090,`0099,`0090,`0099`009`125,
  363. X`009`123 "Weapon Temp",`0090,`0091200,`0090,`009800`009`125,
  364. X`009`123 "Engine Temp",`0090,`0091200,`0090,`009800`009`125,
  365. X`125;
  366. X
  367. Xstatic int`009`009textWidth = 0;
  368. Xstatic int `009`009initialized = 0;
  369. X
  370. XinitStats()
  371. X`123
  372. X    int`009i;
  373. X    /*char`009*str;*/
  374. X
  375. X    if (initialized) return;
  376. X    initialized=1;
  377. X    sliders`0910`093.var = &(me->p_shield);
  378. X    sliders`0911`093.var = &(me->p_damage);
  379. X    sliders`0912`093.var = &(me->p_fuel);
  380. X    sliders`0913`093.var = &(me->p_speed);
  381. X    sliders`0914`093.var = &(me->p_wtemp);
  382. X    sliders`0915`093.var = &(me->p_etemp);
  383. X    for (i = 0; i < NUM_SLIDERS; i++) `123
  384. X`009sliders`091i`093.label_length = strlen(sliders`091i`093.label);
  385. X`009textWidth = MAX(textWidth, sliders`091i`093.label_length);
  386. X`009sliders`091i`093.diff = sliders`091i`093.max - sliders`091i`093.min;
  387. X`009sliders`091i`093.lastVal=0;
  388. X    `125
  389. X`125
  390. X
  391. XredrawStats()
  392. X`123
  393. X    int`009i;
  394. X
  395. X    W_ClearWindow(statwin);
  396. X    initStats();
  397. X    for (i=0; i<NUM_SLIDERS; i++) `123
  398. X`009sliders`091i`093.lastVal=0;
  399. X    `125
  400. X    for (i = 0; i < NUM_SLIDERS; i++) `123
  401. X`009W_WriteText(statwin, TX_OFF(sliders`091i`093.label_length), TY_OFF(i),
  402. X`009    textColor, sliders`091i`093.label, sliders`091i`093.label_length,
  403. X`009    W_RegularFont);
  404. X#ifdef VMS
  405. X`009boxf(0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID+2, SL_HEI+2, borderColor);
  406. X#else
  407. X`009box(0, BX_OFF() - 1, BY_OFF(i) - 1, SL_WID+2, SL_HEI+2, borderColor);
  408. X#endif
  409. X`009sliders`091i`093.lastVal=0;
  410. X    `125
  411. X`125
  412. X
  413. XupdateStats()
  414. X`123
  415. X    int`009i, value, diff, old_x, new_x;
  416. X    W_Color color;
  417. X    SLIDER`009*s;
  418. X
  419. X    initStats();
  420. X    for (i = 0; i < NUM_SLIDERS; i++) `123
  421. X`009s = &sliders`091i`093;
  422. X`009value= *(s->var);
  423. X`009if (value < s->min)
  424. X`009    value = s->min;
  425. X`009else if (value > s->max)
  426. X`009    value = s->max;
  427. X`009if (value == s->lastVal)
  428. X`009    continue;
  429. X`009diff = value - s->lastVal;
  430. X`009if (diff < 0) `123
  431. X`009    old_x = s->lastVal * SL_WID / s->diff;
  432. X`009    new_x = value * SL_WID / s->diff;
  433. X#ifdef VMS
  434. X`009    boxf(1, BX_OFF()+new_x, BY_OFF(i), old_x-new_x, SL_HEI, backColor);
  435. X#else
  436. X`009    box(1, BX_OFF()+new_x, BY_OFF(i), old_x-new_x, SL_HEI, backColor);
  437. X#endif
  438. X
  439. X`009    if (s->lastVal >= s->low_red && value < s->low_red)`032
  440. X#ifdef VMS
  441. X`009`009boxf(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, warningColor);
  442. X#else
  443. X`009`009box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, warningColor);
  444. X#endif
  445. X`009    else if (s->lastVal > s->high_red && value <= s->high_red)`032
  446. X#ifdef VMS
  447. X`009`009boxf(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, myColor);
  448. X#else
  449. X`009`009box(1, BX_OFF(), BY_OFF(i), new_x, SL_HEI, myColor);
  450. X#endif
  451. X`009`125 else `123
  452. X`009    if (value < s->low_red)
  453. X`009`009color = warningColor;
  454. X`009    else if (value > s->high_red) `123
  455. X`009`009color = warningColor;
  456. X`009`009if (s->lastVal <= s->high_red)
  457. X`009`009    s->lastVal = 0;
  458. X`009    `125 else `123
  459. X`009`009color = myColor;
  460. X`009`009if (s->lastVal < s->low_red)
  461. X`009`009    s->lastVal = 0;
  462. X`009    `125
  463. X`009    old_x = s->lastVal * SL_WID / s->diff;
  464. X`009    new_x = value * SL_WID / s->diff;
  465. X#ifdef VMS
  466. X`009    boxf(1, BX_OFF() + old_x, BY_OFF(i), new_x - old_x, SL_HEI, color);
  467. X#else
  468. X`009    box(1, BX_OFF() + old_x, BY_OFF(i), new_x - old_x, SL_HEI, color);
  469. X#endif
  470. X`009`125
  471. X`009s->lastVal=value;
  472. X    `125
  473. X`125
  474. X
  475. X#ifdef VMS
  476. Xboxf(filled, x, y, wid, hei, color)
  477. X#else
  478. Xbox(filled, x, y, wid, hei, color)
  479. X#endif
  480. Xint filled, x, y, wid, hei;
  481. XW_Color color;
  482. X`123
  483. X    if (wid==0) return;
  484. X
  485. X    if (filled) `123
  486. X`009W_ClearArea(statwin, x, y, wid+1, hei+1, color);
  487. X`009return;
  488. X    `125
  489. X
  490. X    W_MakeLine(statwin,x,y,x+wid,y,color);
  491. X    W_MakeLine(statwin,x+wid,y,x+wid,y+hei,color);
  492. X    W_MakeLine(statwin,x+wid,y+hei,x,y+hei,color);
  493. X    W_MakeLine(statwin,x,y+hei,x,y,color);
  494. X`125
  495. X
  496. X
  497. Xcalibrate_stats()
  498. X`123
  499. X    register int i;
  500. X
  501. X    sliders`0910`093.max = me->p_ship.s_maxshield;
  502. +-+-+-+-+-+-+-+-  END  OF PART 42 +-+-+-+-+-+-+-+-
  503.