Annotation of mstools/samples/nwlink/connect/connect.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.