#include #include #include #include #include #include #include #include #include #include #define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) #define SerrExit(s,msg) do { close(s); perror(msg); _exit(EXIT_FAILURE); } while (0) #define SERVER_PATH "/tmp/unix_sock.server" #define CLIENT_PATH "unix_sock.client" #define DATA "Hello from client" #define BUF 128 #define FINS "exit_s" #define FINC "exit_c" //#define INFO int rcvBuffer(int sock_fd){ int rcvBufferSize; socklen_t sockOptSize = sizeof(rcvBufferSize); getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize); #ifdef INFO printf("initial socket receive buf %d\n", rcvBufferSize); #endif return rcvBufferSize; } int recvCount(const void *s, int size){ register int count; register int mark; register char *p; p=(char *)s; count = 0; mark = 0; do { if (*p && !(*(p+1))) count++; #ifdef INFO printf("[%c][%X]\n",*p,*p); #endif p++; mark++; } while (!((*p == '\0') && (*(p+1)=='\0')) && (mark < size)); return count; } int main(int argc,char *argv[]){ int client_sock, rc, len; struct sockaddr_un server_sockaddr; struct sockaddr_un client_sockaddr; char obuf[BUF]; char **ibuf; size_t obs=BUF,ibs; char cpath[22]; sprintf(cpath,"%d-%s",getpid(),CLIENT_PATH); len = sizeof(client_sockaddr); memset(&server_sockaddr, 0, sizeof(struct sockaddr_un)); memset(&client_sockaddr, 0, sizeof(struct sockaddr_un)); client_sock = socket(AF_UNIX, SOCK_STREAM, 0); if (client_sock == -1) { perror("socket"); exit(1); } client_sockaddr.sun_family = AF_UNIX; strcpy(client_sockaddr.sun_path, cpath); unlink(cpath); rc = bind(client_sock, (struct sockaddr *) &client_sockaddr, len); if (rc == -1) SerrExit(client_sock,"bind"); server_sockaddr.sun_family = AF_UNIX; strcpy(server_sockaddr.sun_path, SERVER_PATH); rc = connect(client_sock, (struct sockaddr *) &server_sockaddr, len); if (rc == -1) SerrExit(client_sock,"connect"); ibs=rcvBuffer(client_sock); if ((ibuf=(char **)malloc(ibs)) == NULL ) errExit("malloc"); do { memset(obuf, 0, obs); printf("> "); scanf("%s",obuf); printf("Sending data...\n"); rc = send(client_sock, obuf, strlen(obuf)+1, 0); if (rc == -1) { perror("send"); close(client_sock); exit(1); } else { printf("Data sent!\n"); } printf("Waiting to recieve data...\n"); memset(ibuf, 0, ibs); rc = recv(client_sock, ibuf, ibs,0); if (rc == -1) { perror("recv"); close(client_sock); exit(1); } else { int c = recvCount(ibuf,ibs); #ifdef INFO char *p = (char *)ibuf; printf("count: %d resieved\n",c); for (int i = 0; i < 32; i++){ printf("[%c][%X]",*p,*p); p++; } printf("\n"); #endif #ifndef INFO char p[obs]; char *tp = (char *)ibuf; // if ((ibuf=(char **)malloc(ibs)) == NULL ) errExit("malloc"); for (int i = 0; i < c; i++){ memset(p,0,obs); while (*tp) {strncat(p,tp,1);tp++;} tp++; // printf("DATA RECEIVED [%ld] = %s\n", strlen(ibuf[i]),ibuf[i]); printf("DATA RECEIVED [%ld] = %s\n", strlen(p),p); // printf("DATA RECEIVED [%ld] = %s\n", strlen(p[i]),p[i]); } #endif } } while (strcmp(obuf,FINC) && strcmp(obuf,FINS)); close(client_sock); unlink(cpath); return 0; }