|
|
1.1 ! root 1: /****************************************************************************\ ! 2: * dgrecv.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 waiting for a datagram packet. ! 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 raddr; ! 28: ! 29: /* ! 30: * Function Prototypes ! 31: */ ! 32: ! 33: extern int main(int, char **); ! 34: extern int net_init(SOCKET *); ! 35: extern int dg_recv(SOCKET); ! 36: ! 37: /**************************************************************************** ! 38: * ! 39: * FUNCTION: main( int argc, char **argv ) ! 40: * ! 41: * PURPOSE: This is the main entry for the program ! 42: * ! 43: * ! 44: * ARGUMENTS: argc = Number of arguments ! 45: * argv = Array of ptrs to cmd line args ! 46: * ! 47: * ! 48: * RETURNS: Exit code for the program ! 49: * ! 50: *\***************************************************************************/ ! 51: int main(int argc, char **argv) ! 52: { ! 53: SOCKET s; ! 54: ! 55: /* ! 56: * Initialize our default values before checking the command line ! 57: */ ! 58: ! 59: *Local_Socket_Number = 0x06; ! 60: *(Local_Socket_Number+1) = 0x00; ! 61: ! 62: /* ! 63: * Parse the command line to set up any command line options ! 64: */ ! 65: ! 66: parse_cmd_line(argc, argv); ! 67: ! 68: /* ! 69: * Initialize the network and set up our socket ! 70: */ ! 71: ! 72: if (net_init(&s)) ! 73: return 1; ! 74: ! 75: /* ! 76: * Do the receive thing ! 77: */ ! 78: ! 79: if (dg_recv(s)) ! 80: return 1; ! 81: ! 82: /* ! 83: * All Done - Close up the socket and exit ! 84: */ ! 85: ! 86: if (verbose) ! 87: printf("Calling closesocket()\n"); ! 88: ! 89: closesocket(s); ! 90: ! 91: return 0; ! 92: } ! 93: ! 94: /**************************************************************************** ! 95: * ! 96: * FUNCTION: net_init( SOCKET *skt ) ! 97: * ! 98: * PURPOSE: Initializes the WinSock stuff and sets up our socket. ! 99: * ! 100: * ! 101: * ARGUMENTS: SOCKET * => struct to receive our socket info ! 102: * ! 103: * RETURNS: 0 if ok ! 104: * 1 if error ! 105: * ! 106: *\***************************************************************************/ ! 107: int net_init(SOCKET *skt) ! 108: { ! 109: SOCKET s; ! 110: int rc, addrlen = 16; ! 111: WSADATA wsdata; ! 112: WORD wVersionRequested; ! 113: ! 114: if (verbose) ! 115: printf("Calling WSAStartup(), "); ! 116: ! 117: /* ! 118: * Initialize with the WINSOCK library ! 119: */ ! 120: ! 121: wVersionRequested = MAKEWORD(1,1); ! 122: rc = WSAStartup(wVersionRequested, &wsdata); ! 123: ! 124: if (verbose) ! 125: printf("return = 0x%X (%d)\n", rc, rc); ! 126: ! 127: if (rc) { ! 128: printf("WSAStartup failed: error code = %d\n", rc); ! 129: return 1; ! 130: } ! 131: ! 132: if (verbose) { ! 133: printf("Contents of wsadata struct:\n"); ! 134: print_wsa(&wsdata); ! 135: } ! 136: ! 137: /* ! 138: * Open a DATAGRAM socket with IPX ! 139: */ ! 140: ! 141: if (verbose) ! 142: printf("Calling socket(address family = %d, socket type = %d, protocol = %d)\n", Local_Address_Family, Socket_Type, Protocol); ! 143: ! 144: s = socket(Local_Address_Family, Socket_Type, Protocol); ! 145: ! 146: if (verbose) ! 147: printf("socket() returned 0x%X (%d)\n", s, s); ! 148: ! 149: if (s == INVALID_SOCKET) { ! 150: dos_net_perror("Socket call failed"); ! 151: exit(1); ! 152: } ! 153: ! 154: /* ! 155: * Bind to a socket. We dont care what socket we bind to, ! 156: * so we will send down all 0's ! 157: */ ! 158: ! 159: addr.sa_family = Local_Address_Family; ! 160: ! 161: memcpy(&addr.sa_netnum, Local_Network_Number, 4); ! 162: memcpy(&addr.sa_nodenum, Local_Node_Number, 6); ! 163: memcpy(&addr.sa_socket, Local_Socket_Number, 2); ! 164: ! 165: if (verbose) { ! 166: printf("calling bind(), local address =\n "); ! 167: print_saddr(&addr); ! 168: } ! 169: ! 170: rc = bind(s, (struct sockaddr *) &addr, 16); ! 171: ! 172: if (verbose) ! 173: printf("\nbind() returned 0x%X (%d)\n", rc, rc); ! 174: ! 175: if (rc == SOCKET_ERROR) { ! 176: dos_net_perror("Error binding to socket"); ! 177: closesocket(s); ! 178: return 1; ! 179: } ! 180: ! 181: /* ! 182: * Get the address we bound to and print it out ! 183: */ ! 184: ! 185: if (verbose) ! 186: printf("calling getsockname(socket = %d), ", s); ! 187: ! 188: rc = getsockname(s, (struct sockaddr *) &baddr, &addrlen); ! 189: ! 190: if (verbose) ! 191: printf("return = 0x%lX (%d)\n", rc, rc); ! 192: ! 193: if (rc == SOCKET_ERROR) { ! 194: dos_net_perror("Error getting socket name"); ! 195: closesocket(s); ! 196: return 1; ! 197: } ! 198: ! 199: /* ! 200: * Set the packet type to send for this socket ! 201: */ ! 202: ! 203: if (verbose) ! 204: printf("Calling setsockopt for packet type %d\n", Local_Packet_Type); ! 205: ! 206: rc = setsockopt(s, NSPROTO_IPX, IPX_PTYPE, (const char *) &Local_Packet_Type, 4); ! 207: ! 208: if (rc == SOCKET_ERROR) ! 209: dos_net_perror("setsockopt() call failed"); ! 210: ! 211: ! 212: if (Filter_Packet_Type) { ! 213: ! 214: /* ! 215: * Set the packet type for this socket ! 216: */ ! 217: ! 218: if (verbose) ! 219: printf("Calling setsockopt to filter packet type %d\n", Filter_Packet_Type); ! 220: ! 221: rc = setsockopt(s, NSPROTO_IPX, IPX_FILTERPTYPE, (const char *) &Filter_Packet_Type, sizeof(int)); ! 222: printf("RC from FILTER SOCKOPT = %d\n", rc); ! 223: ! 224: if (rc == SOCKET_ERROR) ! 225: dos_net_perror("setsockopt() call failed setting filter packet type"); ! 226: } ! 227: /* ! 228: * Print out the network address ! 229: */ ! 230: ! 231: if (verbose) { ! 232: printf("addrlen = %d\n", addrlen); ! 233: print_netaddr(baddr.sa_netnum, " Bound to address ", "\n"); ! 234: } ! 235: ! 236: *skt = s; ! 237: ! 238: return 0; ! 239: } ! 240: ! 241: /**************************************************************************** ! 242: * ! 243: * FUNCTION: dg_recv( SOCKET s ) ! 244: * ! 245: * PURPOSE: Receives datagrams. ! 246: * ! 247: * ARGUMENTS: SOCKET socket to receive on ! 248: * ! 249: * RETURNS: 0 if ok ! 250: * 1 if error ! 251: * ! 252: *\***************************************************************************/ ! 253: int dg_recv(SOCKET s) ! 254: { ! 255: int rc, errflag = 0; ! 256: int addrlen = 16; ! 257: UINT dgrams = 0; ! 258: LPSTR recvbuf; ! 259: ! 260: ! 261: if (verbose) ! 262: printf("allocating %d bytes for receive buffer\n", Receive_Length); ! 263: ! 264: /* ! 265: * Set up the data buffer to send ! 266: */ ! 267: ! 268: recvbuf = (LPSTR)malloc(Send_Length); ! 269: ! 270: if (!recvbuf) { ! 271: printf("Error allocating %d bytes for receive buffer\n", Receive_Length); ! 272: return 1; ! 273: } ! 274: ! 275: if (verbose) { ! 276: printf("calling recvfrom(socket = %d, length = %d),\n", s, Receive_Length); ! 277: } ! 278: else ! 279: printf("Waiting for call...\n"); ! 280: ! 281: while (1) { ! 282: /* ! 283: * Receive a packet from anyone ! 284: */ ! 285: ! 286: rc = recvfrom(s, recvbuf, Receive_Length, 0, (struct sockaddr *)&raddr, &addrlen); ! 287: ! 288: if (rc == SOCKET_ERROR) { ! 289: dos_net_perror("recvfrom() failed"); ! 290: errflag++; ! 291: break; ! 292: } ! 293: ! 294: if (verbose) { ! 295: printf("Received %d bytes from \n ", rc); ! 296: print_saddr(&raddr); ! 297: printf("\n"); ! 298: } ! 299: else ! 300: printf("\rReceived packet %d, length = %d bytes", ++dgrams, rc); ! 301: ! 302: ! 303: if (No_Loop) ! 304: break; ! 305: } ! 306: ! 307: if (verbose) ! 308: printf("Freeing receive buffer\n"); ! 309: ! 310: free(recvbuf); ! 311: ! 312: return errflag; ! 313: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.