|
|
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 using SPX connect.
8: *
9: ****************************************************************************/
10: #include <windows.h>
11: #include <winsock.h>
12: #include <stdio.h>
13: #include <stdlib.h>
14: #include <string.h>
15: #include <malloc.h>
16: #include <wsipx.h>
17: #include "../testlib/testlib.h"
18:
19: SOCKADDR_IPX addr;
20: SOCKADDR_IPX baddr;
21: SOCKADDR_IPX caddr;
22:
23: UCHAR ch = 0;
24:
25: /*
26: * Function Prototypes
27: */
28:
29: extern int main(int, char **);
30: extern int net_init(SOCKET *);
31: extern int make_connection(SOCKET);
32: extern int do_send_receive(SOCKET);
33:
34: /****************************************************************************
35: *
36: * FUNCTION: main( int argc, char **argv )
37: *
38: * PURPOSE: This is the main entry for the program
39: *
40: *
41: * ARGUMENTS: argc = Number of arguments
42: * argv = Array of ptrs to cmd line args
43: *
44: *
45: * RETURNS: Exit code for the program
46: *
47: *\***************************************************************************/
48: int main(int argc, char **argv)
49: {
50: SOCKET s;
51:
52: /*
53: * Set up our default values before checking command line
54: */
55:
56: memcpy(Remote_Node_Number, "\x08\x00\x2B\x2E\x98\xA8", 6);
57: memcpy(Remote_Socket_Number, "\x05\x00", 2);
58: Socket_Type = SOCK_STREAM;
59: Protocol = NSPROTO_SPX;
60: Remote_Address_Family = AF_NS;
61: Sleep_Time = 250;
62:
63: /*
64: * Get any command line options
65: */
66:
67: parse_cmd_line(argc, argv);
68:
69: /*
70: * Initialize the network and set up the socket
71: */
72:
73: if (net_init(&s))
74: return 1;
75:
76: /*
77: * Try to connect to our server
78: */
79:
80: if (make_connection(s))
81: return 1;
82:
83: /*
84: * Send/receive data to/from server
85: */
86:
87: do_send_receive(s);
88:
89: /*
90: * All done - close up
91: */
92:
93: if (verbose)
94: printf("calling closesocket(socket = %d)\n", s);
95:
96: closesocket(s);
97: return 0;
98: }
99:
100: /****************************************************************************
101: *
102: * FUNCTION: net_init( SOCKET *skt )
103: *
104: * PURPOSE: Initializes the WinSock stuff and sets up our socket.
105: *
106: *
107: * ARGUMENTS: SOCKET * => struct to fill in with opened socket.
108: *
109: * RETURNS: 0 if ok
110: * 1 if error
111: *
112: *\***************************************************************************/
113: int net_init(SOCKET *skt)
114: {
115: SOCKET s;
116: int rc, addrlen;
117: WSADATA wsdata;
118: WORD wVersionRequested;
119:
120: wVersionRequested = MAKEWORD(1,1);
121:
122:
123: /*
124: * Register with the socket library
125: */
126:
127: rc = WSAStartup(wVersionRequested, &wsdata);
128:
129: if (verbose)
130: printf("WSAStartup returned 0x%X\n", rc);
131:
132: if (rc) {
133: printf("WSAStartup failed: error = %d\n", rc);
134: return 1;
135: }
136:
137: if (verbose) {
138: printf("contents of wsdata structure: \n");
139: print_wsa(&wsdata);
140: printf("calling socket(address family = %d, socket type = %d, protocol = %d)\n", Local_Address_Family, Socket_Type, Protocol);
141: }
142:
143: /*
144: * Open a STREAMING socket
145: */
146:
147: s = socket(Local_Address_Family, Socket_Type, Protocol);
148:
149: if (verbose)
150: printf("socket() returned 0x%X (%d)\n", s, s);
151:
152: if (s == INVALID_SOCKET) {
153: dos_net_perror("socket call failed");
154: return 1;
155: }
156:
157: /*
158: * Bind to any address
159: */
160:
161: addr.sa_family = Local_Address_Family;
162: memcpy(&addr.sa_netnum, Local_Network_Number, 4);
163: memcpy(&addr.sa_nodenum, Local_Node_Number, 6);
164: memcpy(&addr.sa_socket, Local_Socket_Number, 2);
165:
166: rc = bind(s, (const struct sockaddr FAR *)&addr, 16);
167:
168: if (verbose)
169: printf("bind() returned 0x%X\n", rc);
170:
171: if (rc == SOCKET_ERROR) {
172: dos_net_perror("bind call failed");
173: return 1;
174: }
175:
176: if (verbose)
177: printf("calling getsockname(socket = %d)\n", s);
178:
179: addrlen = 16;
180: rc = getsockname(s, (struct sockaddr *) &addr, &addrlen);
181:
182: if (verbose)
183: printf("getsockname() returned 0x%X\n", rc);
184:
185: if (rc == SOCKET_ERROR) {
186: dos_net_perror("Error binding to socket");
187: closesocket(s);
188: return 1;
189: }
190:
191: if (verbose) {
192: printf("addrlen = %d\n", addrlen);
193: print_netaddr(addr.sa_netnum, "Bound address = ", "\n");
194: }
195:
196:
197: /*
198: * Build the address of the node to connect to
199: */
200:
201: memcpy(&caddr.sa_netnum, Remote_Network_Number, 4);
202: memcpy(&caddr.sa_nodenum, Remote_Node_Number, 6);
203: memcpy(&caddr.sa_socket, Remote_Socket_Number, 2);
204: caddr.sa_family = AF_NS;
205:
206: /*
207: * Set up socket for return
208: */
209:
210: *skt = s;
211:
212: return 0;
213: }
214:
215: /****************************************************************************
216: *
217: * FUNCTION: make_connection( SOCKET s )
218: *
219: * PURPOSE: Establishes a connection with our server.
220: *
221: * ARGUMENTS: SOCKET socket to use for connection
222: *
223: * RETURNS: 0 if ok
224: * 1 if error
225: *
226: *\***************************************************************************/
227: int make_connection(SOCKET s)
228: {
229: int rc, addrlen;
230:
231: /*
232: * Connect
233: */
234:
235: if (verbose)
236: printf("calling connect(socket = %d)\n", s);
237:
238: rc = connect(s, (const struct sockaddr FAR *)&caddr, 16);
239:
240: if (verbose)
241: printf("connect() returned 0x%X\n", rc);
242:
243: if (rc == SOCKET_ERROR) {
244: dos_net_perror("connect call failed");
245: return 1;
246: }
247:
248: printf("Connect OK\n");
249:
250: /*
251: * Print out address we connected to
252: */
253:
254: if (verbose)
255: printf("calling getpeername(socket = %d)\n", s);
256:
257: addrlen = 16;
258: rc = getpeername(s, (struct sockaddr *) &caddr, &addrlen);
259:
260: if (verbose)
261: printf("getpeername() returned 0x%X\n", rc);
262:
263: if (verbose) {
264: printf("addrlen = %d\n", addrlen);
265: print_netaddr(caddr.sa_netnum, "Remote Address = ", "\n");
266: }
267:
268: return 0;
269: }
270: /****************************************************************************
271: *
272: * FUNCTION: do_send_receive( SOCKET *s )
273: *
274: * PURPOSE: Alternately sends/receives data to/from the server.
275: *
276: * ARGUMENTS: SOCKET socket to transmit on
277: *
278: * RETURNS: 0 if ok
279: * 1 if error
280: *
281: *\***************************************************************************/
282: int do_send_receive(SOCKET s)
283: {
284: int rc, errflag = 0;
285: int sndpkts = 0, rcvpkts = 0;
286: LPSTR sendbuf;
287:
288: /*
289: * Allocate a send buffer
290: */
291:
292: if (verbose)
293: printf("Allocating %d bytes for send buffer \n");
294:
295: sendbuf = malloc(Send_Length);
296:
297: if (!sendbuf) {
298: printf("Error allocating %d bytes for send buffer\n");
299: return 1;
300: }
301:
302: /*
303: * Send data and recv it back
304: */
305:
306: while (1) {
307:
308: /*
309: * Fill the buffer with our current character
310: */
311:
312: memset(sendbuf, ch, Send_Length);
313:
314: /*
315: * Send data
316: */
317:
318: if (verbose)
319: printf("calling send(socket = %d, length = %d)\n", s, Send_Length);
320:
321: rc = send(s, sendbuf, Send_Length, 0);
322:
323: if (verbose)
324: printf("send() returned 0x%X\n", rc);
325:
326: if (rc == SOCKET_ERROR) {
327: dos_net_perror("\nsend() call failed");
328: errflag++;
329: break;
330: }
331:
332: if (verbose)
333: printf("Sent packet %d: sent %d bytes\n", sndpkts++, rc);
334: else
335: printf("\rSent packet %d: sent %d bytes... ", sndpkts++, rc);
336:
337: /*
338: * Receive the data back
339: */
340:
341: if (verbose)
342: printf("calling recv(socket = %d, length = %d)\n", s, Send_Length);
343:
344: rc = recv(s, sendbuf, Send_Length, 0);
345:
346: if (verbose)
347: printf("recv() returned %d\n", rc);
348:
349: if (rc == SOCKET_ERROR) {
350: dos_net_perror("\nrecv() call failed");
351: errflag++;
352: break;
353: }
354:
355: if (!rc) {
356: printf("connection has been lost\n");
357: break;
358: }
359:
360: printf("Received %d bytes", rc);
361:
362: if (verbose)
363: printf("\n");
364:
365: /*
366: * See if our buffer has the same data in it
367: */
368:
369: rc = mem_check(sendbuf, ch++, Send_Length);
370:
371: if (rc)
372: printf("Data compare error: packet = %d, offset = %d\n", (sndpkts-1), rc);
373: else if (verbose)
374: printf("Data compares okay\n");
375:
376: /*
377: * If we are to send just 1, break out
378: */
379:
380: if (No_Loop)
381: break;
382:
383: /*
384: * Pause a little while (don't trash the network)
385: */
386:
387: Sleep(Sleep_Time);
388: }
389:
390: if (verbose)
391: printf("\nFreeing send buffer\n");
392:
393: free(sendbuf);
394:
395: return errflag;
396: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.