|
|
1.1 ! root 1: /****************************************************************************\ ! 2: * dgsend.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, and sending a packet repeatedly. ! 9: * ! 10: ****************************************************************************/ ! 11: #include <windows.h> ! 12: #include <winsock.h> ! 13: #include <stdio.h> ! 14: #include <stdlib.h> ! 15: #include <string.h> ! 16: #include <malloc.h> ! 17: #include <wsipx.h> ! 18: #include <wsnwlink.h> ! 19: #include "..\testlib\testlib.h" ! 20: ! 21: /* ! 22: * Sockaddr structures ! 23: */ ! 24: ! 25: SOCKADDR_IPX addr; ! 26: SOCKADDR_IPX baddr; ! 27: SOCKADDR_IPX saddr; ! 28: ! 29: /* ! 30: * Data for sending ! 31: */ ! 32: ! 33: char send_data[] = "This is an IPX packet from NT"; ! 34: ! 35: /* ! 36: * Function Prototypes ! 37: */ ! 38: extern int main(int, char **); ! 39: extern int net_init(SOCKET *); ! 40: extern int enable_broadcasts(SOCKET); ! 41: extern void build_dest_addr(SOCKET, PSOCKADDR_IPX); ! 42: extern int dg_send(SOCKET); ! 43: ! 44: /**************************************************************************** ! 45: * ! 46: * FUNCTION: main( int argc, char **argv ) ! 47: * ! 48: * PURPOSE: This is the main entry for the program ! 49: * ! 50: * ! 51: * ARGUMENTS: argc = Number of arguments ! 52: * argv = Array of ptrs to cmd line args ! 53: * ! 54: * ! 55: * RETURNS: Exit code for the program ! 56: * ! 57: *\***************************************************************************/ ! 58: int main(int argc, char **argv) ! 59: { ! 60: SOCKET s; ! 61: ! 62: /* ! 63: * Fill in any default values before checking the command line ! 64: */ ! 65: ! 66: *Remote_Socket_Number = 0x06; ! 67: *(Remote_Socket_Number+1) = 0x00; ! 68: Sleep_Time = 500; ! 69: ! 70: /* ! 71: * Parse the command line to set up any command line options ! 72: */ ! 73: ! 74: parse_cmd_line(argc, argv); ! 75: ! 76: if (net_init(&s)) ! 77: return 1; ! 78: ! 79: if (!No_Broadcast) { ! 80: if (enable_broadcasts(s)) ! 81: return 1; ! 82: } ! 83: ! 84: build_dest_addr(s, &saddr); ! 85: ! 86: /* ! 87: * Send some datagrams ! 88: */ ! 89: ! 90: dg_send(s); ! 91: ! 92: /* ! 93: * All Done - Close up the socket and exit ! 94: */ ! 95: ! 96: if (verbose) ! 97: printf("Calling closesocket()\n"); ! 98: ! 99: closesocket(s); ! 100: return 0; ! 101: } ! 102: ! 103: /**************************************************************************** ! 104: * ! 105: * FUNCTION: net_init( SOCKET *skt ) ! 106: * ! 107: * PURPOSE: Initializes the WinSock stuff and sets up our socket. ! 108: * ! 109: * ! 110: * ARGUMENTS: SOCKET * => struct to receive our socket info ! 111: * ! 112: * RETURNS: 0 if ok ! 113: * 1 if error ! 114: * ! 115: *\***************************************************************************/ ! 116: int net_init(SOCKET *skt) ! 117: { ! 118: SOCKET s; ! 119: WSADATA wsdata; ! 120: WORD wVersionRequested; ! 121: ! 122: ! 123: int rc, addrlen = 16; ! 124: ! 125: if (verbose) ! 126: printf("Calling WSAStartup(), "); ! 127: ! 128: /* ! 129: * Initialize with the WINSOCK library ! 130: */ ! 131: ! 132: wVersionRequested = MAKEWORD(1,1); ! 133: rc = WSAStartup(wVersionRequested, &wsdata); ! 134: ! 135: if (verbose) ! 136: printf("return = 0x%X (%d)\n", rc, rc); ! 137: ! 138: if (rc) { ! 139: printf("WSAStartup failed: error code = %d\n", rc); ! 140: return 1; ! 141: } ! 142: ! 143: if (verbose) { ! 144: printf("Contents of wsadata struct:\n"); ! 145: print_wsa(&wsdata); ! 146: } ! 147: ! 148: /* ! 149: * Open a DATAGRAM socket with IPX ! 150: */ ! 151: ! 152: if (verbose) ! 153: printf("Calling socket(address family = %d, socket type = %d, protocol = %d)\n", Local_Address_Family, Socket_Type, Protocol); ! 154: ! 155: s = socket(Local_Address_Family, Socket_Type, Protocol); ! 156: ! 157: if (verbose) ! 158: printf("socket() returned 0x%X (%d)\n", s, s); ! 159: ! 160: if (s == INVALID_SOCKET) { ! 161: dos_net_perror("Socket call failed"); ! 162: exit(1); ! 163: } ! 164: ! 165: /* ! 166: * Bind to a socket. We dont care what socket we bind to, ! 167: * so we will send down all 0's ! 168: */ ! 169: ! 170: addr.sa_family = Local_Address_Family; ! 171: ! 172: memcpy(&addr.sa_netnum, Local_Network_Number, 4); ! 173: memcpy(&addr.sa_nodenum, Local_Node_Number, 6); ! 174: memcpy(&addr.sa_socket, Local_Socket_Number, 2); ! 175: ! 176: if (verbose) { ! 177: printf("calling bind(), local address =\n "); ! 178: print_saddr(&addr); ! 179: } ! 180: ! 181: rc = bind(s, (const struct sockaddr *) &addr, 16); ! 182: ! 183: if (verbose) ! 184: printf("\nbind() returned 0x%X (%d)\n", rc, rc); ! 185: ! 186: if (rc == SOCKET_ERROR) { ! 187: dos_net_perror("Error binding to socket"); ! 188: printf("Socket = 0x%lx\n", s); ! 189: closesocket(s); ! 190: return 1; ! 191: } ! 192: ! 193: /* ! 194: * Get the address we bound to and print it out ! 195: */ ! 196: ! 197: if (verbose) ! 198: printf("calling getsockname(socket = %d), ", s); ! 199: ! 200: rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen); ! 201: ! 202: if (verbose) ! 203: printf("return = 0x%lX (%d)\n", rc, rc); ! 204: ! 205: if (rc == SOCKET_ERROR) { ! 206: dos_net_perror("Error getting socket name"); ! 207: closesocket(s); ! 208: return 1; ! 209: } ! 210: ! 211: /* ! 212: * Set the packet type for this socket ! 213: */ ! 214: ! 215: if (verbose) ! 216: printf("Calling setsockopt for packet type %d\n", Local_Packet_Type); ! 217: ! 218: rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Local_Packet_Type, 4); ! 219: ! 220: if (rc == SOCKET_ERROR) ! 221: dos_net_perror("setsockopt() call failed"); ! 222: ! 223: /* ! 224: * Print out the network address ! 225: */ ! 226: ! 227: if (verbose) { ! 228: printf("addrlen = %d\n", addrlen); ! 229: print_netaddr(baddr.sa_netnum, " Bound to address ", "\n"); ! 230: } ! 231: ! 232: *skt = s; ! 233: ! 234: return 0; ! 235: } ! 236: ! 237: /**************************************************************************** ! 238: * ! 239: * FUNCTION: enable_broadcasts( SOCKET s ) ! 240: * ! 241: * PURPOSE: Sets the socket option to enable broadcast sends on it. ! 242: * ! 243: * ! 244: * ARGUMENTS: SOCKET socket to enable ! 245: * ! 246: * RETURNS: 0 if ok ! 247: * 1 if error ! 248: * ! 249: *\***************************************************************************/ ! 250: int enable_broadcasts(SOCKET s) ! 251: { ! 252: int rc; ! 253: BOOL optval = TRUE; ! 254: ! 255: /* ! 256: * Enable sending of broadcasts ! 257: */ ! 258: ! 259: /* ! 260: * NOTE: This only needs to be done if you want to SEND ! 261: * broadcast packets. Reception of broadcast ! 262: * packets will happen automatically. ! 263: */ ! 264: ! 265: if (verbose) ! 266: printf("Setting socket option to broadcast, "); ! 267: rc = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char *)&optval, sizeof(int)); ! 268: if (verbose) ! 269: printf("return = 0x%X (%d)\n", rc, rc); ! 270: ! 271: if (rc == SOCKET_ERROR) { ! 272: dos_net_perror("Error enabling broadcast address"); ! 273: closesocket(s); ! 274: return 1; ! 275: } ! 276: ! 277: return 0; ! 278: } ! 279: ! 280: /**************************************************************************** ! 281: * ! 282: * FUNCTION: build_dest_addr( SOCKET s ) ! 283: * ! 284: * PURPOSE: Fills in the destination address fields and sets the packet type. ! 285: * ! 286: * ! 287: * ARGUMENTS: SOCKET socket to set packet type for ! 288: * PSOCKADDR_NS => address struct to fill in ! 289: * ! 290: * RETURNS: 0 if ok ! 291: * 1 if error ! 292: * ! 293: *\***************************************************************************/ ! 294: void build_dest_addr(SOCKET s, PSOCKADDR_IPX psaddr) ! 295: { ! 296: int rc; ! 297: ! 298: /* ! 299: * Build the dest. address ! 300: */ ! 301: ! 302: psaddr->sa_family = Remote_Address_Family; ! 303: ! 304: /* ! 305: * Set dest. network number ! 306: */ ! 307: ! 308: memcpy(&psaddr->sa_netnum, Remote_Network_Number, 4); ! 309: ! 310: /* ! 311: * Set dest. node address ! 312: */ ! 313: ! 314: memcpy(&psaddr->sa_nodenum, Remote_Node_Number, 6); ! 315: ! 316: /* ! 317: * Set the dest. socket number ! 318: */ ! 319: ! 320: memcpy(&psaddr->sa_socket, Remote_Socket_Number, 2); ! 321: ! 322: ! 323: /* ! 324: * Set the packet type for this socket ! 325: */ ! 326: ! 327: if (verbose) ! 328: printf("Calling setsockopt for packet type %d\n", Send_Packet_Type); ! 329: ! 330: rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Send_Packet_Type, sizeof(int)); ! 331: ! 332: if (rc == SOCKET_ERROR) ! 333: dos_net_perror("setsockopt() call failed"); ! 334: ! 335: return; ! 336: } ! 337: ! 338: /**************************************************************************** ! 339: * ! 340: * FUNCTION: dg_send( SOCKET s ) ! 341: * ! 342: * PURPOSE: Receives datagrams. ! 343: * ! 344: * ARGUMENTS: SOCKET socket to transmit on ! 345: * ! 346: * RETURNS: 0 if ok ! 347: * 1 if error ! 348: * ! 349: *\***************************************************************************/ ! 350: int dg_send(SOCKET s) ! 351: { ! 352: LPSTR sendbuf; ! 353: int rc, errflag = 0; ! 354: UINT dgrms = 0; ! 355: ! 356: if (verbose) ! 357: printf("allocating %d bytes for send buffer\n", Send_Length); ! 358: ! 359: /* ! 360: * Set up the data buffer to send ! 361: */ ! 362: ! 363: sendbuf = (LPSTR)malloc(Send_Length); ! 364: ! 365: if (!sendbuf) { ! 366: printf("Error allocating %d bytes for send buffer\n", Send_Length); ! 367: return 1; ! 368: } ! 369: ! 370: /* ! 371: * Zero the buffer and copy as much of our data to it as possible ! 372: */ ! 373: ! 374: memset(sendbuf, 0, Send_Length); ! 375: strncpy(sendbuf, send_data, Send_Length); ! 376: ! 377: while (1) { ! 378: if (verbose) { ! 379: printf("calling sendto(socket = %d, length = %d),\n", s, Send_Length); ! 380: printf("destination address:\n "); ! 381: print_saddr(&saddr); ! 382: } ! 383: ! 384: /* ! 385: * Send a packet to everybody ! 386: */ ! 387: ! 388: rc = sendto(s, sendbuf, Send_Length, 0, (const struct sockaddr *) &saddr, 16); ! 389: ! 390: if (verbose) ! 391: printf("\nsendto() returned %d\n", rc); ! 392: ! 393: if (rc == SOCKET_ERROR) { ! 394: dos_net_perror("Sendto() failed"); ! 395: errflag++; ! 396: break; ! 397: } ! 398: else { ! 399: printf("\rSent datagram %d, length = %d bytes", ++dgrms, rc); ! 400: if (verbose) ! 401: printf("\n"); ! 402: } ! 403: ! 404: /* ! 405: * If we are to send only one, break out ! 406: */ ! 407: ! 408: if (No_Loop) ! 409: break; ! 410: ! 411: /* ! 412: * Sleep for a little while so we don't bombard the network ! 413: */ ! 414: ! 415: Sleep(Sleep_Time); ! 416: } ! 417: ! 418: if (verbose) ! 419: printf("Freeing send buffer\n"); ! 420: ! 421: free(sendbuf); ! 422: ! 423: return errflag; ! 424: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.