|
|
1.1 ! root 1: /****************************************************************************\ ! 2: * ping.c -- sample program demonstrating NWLink. ! 3: * ! 4: * Microsoft Developer Support ! 5: * Copyright (c) 1992, 1993 Microsoft Corporation ! 6: * ! 7: * This program is a simple example of opening a socket, ! 8: * binding to the socket, receiving a packet and sending ! 9: * that packet back to the original sender. ! 10: * ! 11: ****************************************************************************/ ! 12: #include <windows.h> ! 13: #include <winsock.h> ! 14: #include <stdio.h> ! 15: #include <stdlib.h> ! 16: #include <string.h> ! 17: #include <malloc.h> ! 18: #include <wsipx.h> ! 19: #include <wsnwlink.h> ! 20: #include "../testlib/testlib.h" ! 21: ! 22: /* ! 23: * Sockaddr structures ! 24: */ ! 25: ! 26: SOCKADDR_IPX addr; ! 27: SOCKADDR_IPX baddr; ! 28: SOCKADDR_IPX raddr; ! 29: int addrlen; ! 30: ! 31: /* ! 32: * Function Prototypes ! 33: */ ! 34: ! 35: extern int main(int, char **); ! 36: extern int net_init(SOCKET *); ! 37: extern int do_ping(SOCKET); ! 38: ! 39: /**************************************************************************** ! 40: * ! 41: * FUNCTION: main( int argc, char **argv ) ! 42: * ! 43: * PURPOSE: This is the main entry for the program ! 44: * ! 45: * ! 46: * ARGUMENTS: argc = Number of arguments ! 47: * argv = Array of ptrs to cmd line args ! 48: * ! 49: * ! 50: * RETURNS: Exit code for the program ! 51: * ! 52: *\***************************************************************************/ ! 53: int main(int argc, char **argv) ! 54: { ! 55: SOCKET s; ! 56: ! 57: /* ! 58: * Set our default values before calling parse_cmd_line ! 59: */ ! 60: ! 61: *Local_Socket_Number = 0x30; ! 62: *(Local_Socket_Number+1) = 0x00; ! 63: Receive_Length = 2048; ! 64: ! 65: /* ! 66: * Get any command line options ! 67: */ ! 68: ! 69: parse_cmd_line(argc, argv); ! 70: ! 71: /* ! 72: * Initialize the network and set up our socket ! 73: */ ! 74: ! 75: if (net_init(&s)) ! 76: return 1; ! 77: ! 78: do_ping(s); ! 79: ! 80: /* ! 81: * All done (We only get here on error) ! 82: */ ! 83: ! 84: if (verbose) ! 85: printf("calling closesocket()"); ! 86: ! 87: closesocket(s); ! 88: return 0; ! 89: } ! 90: ! 91: /**************************************************************************** ! 92: * ! 93: * FUNCTION: net_init( SOCKET *skt ) ! 94: * ! 95: * PURPOSE: Initializes the WinSock stuff and sets up our socket. ! 96: * ! 97: * ! 98: * ARGUMENTS: SOCKET * => struct to receive our socket info ! 99: * ! 100: * RETURNS: 0 if ok ! 101: * 1 if error ! 102: * ! 103: *\***************************************************************************/ ! 104: int net_init(SOCKET *skt) ! 105: { ! 106: int rc, addrlen; ! 107: WSADATA wsdata; ! 108: SOCKET s; ! 109: WORD wVersionRequested; ! 110: ! 111: /* ! 112: * Initialize with the WINSOCK library ! 113: */ ! 114: ! 115: if (verbose) ! 116: printf("calling WSAStartup(), "); ! 117: ! 118: wVersionRequested = MAKEWORD(1,1); ! 119: rc = WSAStartup(wVersionRequested, &wsdata); ! 120: ! 121: if (verbose) ! 122: printf("return = 0x%X (%d)\n", rc, rc); ! 123: ! 124: if (rc) { ! 125: printf("WSAStartup failed: error code = %d\n", rc); ! 126: return 1; ! 127: } ! 128: ! 129: if (verbose) { ! 130: printf("contents of wsdata struct: \n"); ! 131: print_wsa(&wsdata); ! 132: } ! 133: ! 134: if (verbose) ! 135: printf("calling socket(address family = %d, socket type = %d, protocol = %d)\n", Local_Address_Family, Socket_Type, Protocol); ! 136: ! 137: /* ! 138: * Open a DATAGRAM socket with IPX ! 139: */ ! 140: ! 141: s = socket(AF_NS, SOCK_DGRAM, NSPROTO_IPX); ! 142: ! 143: if (verbose) ! 144: printf("socket() returned 0x%lX\n", s); ! 145: ! 146: if (s == INVALID_SOCKET) { ! 147: dos_net_perror("Socket call failed"); ! 148: exit(1); ! 149: } ! 150: ! 151: /* ! 152: * Bind to a socket. We want to bind to a well known ! 153: * socket so that the app. that sends us a packet will ! 154: * know where to send it. ! 155: */ ! 156: ! 157: addr.sa_family = Local_Address_Family; ! 158: ! 159: memcpy(&addr.sa_netnum, Local_Network_Number, 4); ! 160: memcpy(&addr.sa_nodenum, Local_Node_Number, 6); ! 161: memcpy(&addr.sa_socket, Local_Socket_Number, 2); ! 162: ! 163: if (verbose) { ! 164: printf("calling bind():\n "); ! 165: print_saddr(&addr); ! 166: } ! 167: ! 168: rc = bind(s, (const struct sockaddr *) &addr, 16); ! 169: ! 170: if (verbose) ! 171: printf("bind() returned 0x%X\n", rc); ! 172: ! 173: if (rc == SOCKET_ERROR) { ! 174: dos_net_perror("Error binding to socket"); ! 175: closesocket(s); ! 176: return 1; ! 177: } ! 178: /* ! 179: * Set the packet type for this socket ! 180: */ ! 181: ! 182: if (verbose) ! 183: printf("Calling setsockopt for packet type %d\n", Local_Packet_Type); ! 184: ! 185: rc = setsockopt(s, SOL_SOCKET, IPX_PTYPE, (const char *) &Local_Packet_Type, 4); ! 186: ! 187: if (rc == SOCKET_ERROR) ! 188: dos_net_perror("setsockopt() call failed"); ! 189: ! 190: ! 191: /* ! 192: * Get the address we bound to and print it out ! 193: */ ! 194: ! 195: if (verbose) ! 196: printf("Calling getsockname(socket = %d), "); ! 197: ! 198: addrlen = 16; ! 199: rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen); ! 200: ! 201: if (verbose) ! 202: printf("return = 0x%X (%d)\n", rc, rc); ! 203: ! 204: if (rc == SOCKET_ERROR) { ! 205: dos_net_perror("Error getting socket name"); ! 206: closesocket(s); ! 207: return 1; ! 208: } ! 209: ! 210: /* ! 211: * Print out the network address ! 212: */ ! 213: ! 214: if (verbose) { ! 215: printf("addrlen = %d\n", addrlen); ! 216: print_netaddr(baddr.sa_netnum, "Bound address = ", "\n"); ! 217: } ! 218: ! 219: if (verbose) ! 220: printf("Allocating %d byte receive buffer\n", Receive_Length); ! 221: ! 222: /* ! 223: * Set up socket to send back ! 224: */ ! 225: ! 226: *skt = s; ! 227: ! 228: return 0; ! 229: } ! 230: ! 231: /**************************************************************************** ! 232: * ! 233: * FUNCTION: do_ping( SOCKET s ) ! 234: * ! 235: * PURPOSE: This will receive a packet then send it back. ! 236: * ! 237: * ARGUMENTS: SOCKET socket we are transmitting on. ! 238: * ! 239: * RETURNS: 0 if ok ! 240: * 1 if error ! 241: * ! 242: *\***************************************************************************/ ! 243: int do_ping(SOCKET s) ! 244: { ! 245: LPSTR recvbuf; ! 246: int nbytes, rc, errflag = 0; ! 247: int rcvpkts = 0, sndpkts = 0; ! 248: ! 249: /* ! 250: * Allocate a buffer for receives ! 251: */ ! 252: ! 253: recvbuf = malloc(Receive_Length); ! 254: ! 255: if (!recvbuf) { ! 256: printf("Error allocating %d bytes for receive buffer\n", Receive_Length); ! 257: return 1; ! 258: } ! 259: ! 260: /* ! 261: * This loop will receive a packet and then send ! 262: * it back to whoever sent it to us. ! 263: * ! 264: * To exit the loop - hit CTRL-C. ! 265: */ ! 266: ! 267: while (1) { ! 268: ! 269: /* ! 270: * Recv a packet ! 271: */ ! 272: ! 273: /* ! 274: * NOTE: If you want to know the packet type field of the ! 275: * packet you just received, look at the byte at ! 276: * raddr.sa_ptype. The addrlen returned will be ! 277: * 15. ! 278: * ! 279: * By using the addrlen field unchanged when sending ! 280: * the packet back, you will send the packet back with ! 281: * the same packet type that is was sent with originally ! 282: */ ! 283: ! 284: addrlen = 16; ! 285: ! 286: if (verbose) ! 287: printf("calling recvfrom(socket = %d, len = %d)\n", s, Receive_Length); ! 288: ! 289: nbytes = recvfrom(s, recvbuf, Receive_Length, 0, (struct sockaddr *) &raddr, &addrlen); ! 290: ! 291: /* ! 292: * If error - print it and exit ! 293: */ ! 294: ! 295: if (nbytes == SOCKET_ERROR) { ! 296: dos_net_perror("recvfrom() failed"); ! 297: errflag++; ! 298: break; ! 299: } ! 300: ! 301: if (verbose) { ! 302: printf("received %d bytes, raddr = \n ", nbytes); ! 303: print_saddr(&raddr); ! 304: } ! 305: ! 306: if (!verbose) ! 307: printf("\rRecv packet number %d", ++rcvpkts); ! 308: ! 309: /* ! 310: * Send the data back ! 311: */ ! 312: ! 313: if (verbose) ! 314: printf("calling sendto(socket = %d, len = %d\n", s, nbytes); ! 315: ! 316: addrlen = 16; ! 317: rc = sendto(s, recvbuf, nbytes, 0, (const struct sockaddr *) &raddr, addrlen); ! 318: ! 319: if (verbose) ! 320: printf("sendto() returned 0x%X\n", rc); ! 321: ! 322: if (rc == SOCKET_ERROR) { ! 323: dos_net_perror("sendto() failed"); ! 324: errflag++; ! 325: break; ! 326: } ! 327: ! 328: if (!verbose) ! 329: printf(" : Send packet number %d", ++sndpkts); ! 330: ! 331: } ! 332: ! 333: if (verbose) ! 334: printf("Freeing receive buffer\n"); ! 335: ! 336: free(recvbuf); ! 337: ! 338: return errflag; ! 339: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.