The sample programs use the AF_UNIX_CCSID address family.
/**************************************************************************/ /* This sample program provides code for a client application for */ /* AF_UNIX_CCSID address family. */ /**************************************************************************/ /**************************************************************************/ /* Header files needed for this sample program */ /**************************************************************************/ #include <stdio.h> #include <string.h> #include <wcstr.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/unc.h> /**************************************************************************/ /* Constants used by this program */ /**************************************************************************/ #define SERVER_PATH "/tmp/server" #define BUFFER_LENGTH 250 #define FALSE 0 /* Pass in 1 parameter which is either the */ /* path name of the server as a UNICODE */ /* string, or set the server path in the */ /* #define SERVER_PATH which is a CCSID */ /* 500 string. */ void main(int argc, char *argv[]) { /***********************************************************************/ /* Variable and structure definitions. */ /***********************************************************************/ int sd=-1, rc, bytesReceived; char buffer[BUFFER_LENGTH]; struct sockaddr_unc serveraddr; /***********************************************************************/ /* A do/while(FALSE) loop is used to make error cleanup easier. The */ /* close() of the socket descriptor is only done once at the very end */ /* of the program. */ /***********************************************************************/ do { /********************************************************************/ /* The socket() function returns a socket descriptor representing */ /* an endpoint. The statement also identifies that the UNIX_CCSID */ /* address family with the stream transport (SOCK_STREAM) will be */ /* used for this socket. */ /********************************************************************/ sd = socket(AF_UNIX_CCSID, SOCK_STREAM, 0); if (sd < 0) { perror("socket() failed"); break; } /********************************************************************/ /* If an argument was passed in, use this as the server, otherwise */ /* use the #define that is located at the top of this program. */ /********************************************************************/ memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sunc_family = AF_UNIX_CCSID; if (argc > 1) { /* The argument is a UNICODE path name. Use the default format */ serveraddr.sunc_format = SO_UNC_DEFAULT; wcscpy(serveraddr.sunc_path.wide, (wchar_t *) argv[1]); } else { /* The local #define is CCSID 500. Set the Qlg_Path_Name to use */ /* the character format */ serveraddr.sunc_format = SO_UNC_USE_QLG; serveraddr.sunc_qlg.CCSID = 500; serveraddr.sunc_qlg.Path_Type = QLG_CHAR_SINGLE; serveraddr.sunc_qlg.Path_Length = strlen(SERVER_PATH); strcpy((char *)&serveraddr.sunc_path, SERVER_PATH); } /********************************************************************/ /* Use the connect() function to establish a connection to the */ /* server. */ /********************************************************************/ rc = connect(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if (rc < 0) { perror("connect() failed"); break; } /********************************************************************/ /* Send 250 bytes of a's to the server */ /********************************************************************/ memset(buffer, 'a', sizeof(buffer)); rc = send(sd, buffer, sizeof(buffer), 0); if (rc < 0) { perror("send() failed"); break; } /********************************************************************/ /* In this example we know that the server is going to respond with */ /* the same 250 bytes that we just sent. Since we know that 250 */ /* bytes are going to be sent back to us, we can use the */ /* SO_RCVLOWAT socket option and then issue a single recv() and */ /* retrieve all of the data. */ /* */ /* The use of SO_RCVLOWAT is already illustrated in the server */ /* side of this example, so we will do something different here. */ /* The 250 bytes of the data may arrive in separate packets, */ /* therefore we will issue recv() over and over again until all */ /* 250 bytes have arrived. */ /********************************************************************/ bytesReceived = 0; while (bytesReceived < BUFFER_LENGTH) { rc = recv(sd, & buffer[bytesReceived], BUFFER_LENGTH - bytesReceived, 0); if (rc < 0) { perror("recv() failed"); break; } else if (rc == 0) { printf("The server closed the connection\n"); break; } /*****************************************************************/ /* Increment the number of bytes that have been received so far */ /*****************************************************************/ bytesReceived += rc; } } while (FALSE); /***********************************************************************/ /* Close down any open socket descriptors */ /***********************************************************************/ if (sd != -1) close(sd); }