| | |
| | | #include <stdlib.h> |
| | | #include <getopt.h> |
| | | #include <pthread.h> |
| | | #include <ctype.h> |
| | | |
| | | #define MSG_STR "Hello LingYun IoT Studio Client\n" |
| | | |
| | | typedef void *(THREAD_BODY) (void *thread_arg); |
| | | |
| | | void *thread_worker(void *ctx); |
| | | int thread_start(pthread_t * thread_id, THREAD_BODY * thread_workbody, void *thread_arg); |
| | | |
| | | |
| | | void print_usage(char *progname) |
| | | { |
| | |
| | | memset(&servaddr, 0, sizeof(servaddr)); |
| | | servaddr.sin_family=AF_INET; |
| | | servaddr.sin_port = htons(port); |
| | | servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
| | | //inet_aton("192.168.0.16", &servaddr.sin_addr); |
| | | servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* listen all the IP address on this host */ |
| | | //inet_aton("192.168.0.16", &servaddr.sin_addr); /* Only listen specify IP address on this host */ |
| | | |
| | | rv=bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); |
| | | if(rv < 0) |
| | |
| | | |
| | | printf("Accept new client[%s:%d] successfully\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); |
| | | |
| | | thread_start(&tid, thread_worker, &clifd); |
| | | /* ???? Can not pass &clifd to child process, U can think about the reason ???? */ |
| | | thread_start(&tid, thread_worker, (void *)clifd); |
| | | } |
| | | |
| | | |
| | |
| | | int clifd; |
| | | int rv; |
| | | char buf[1024]; |
| | | int i; |
| | | |
| | | if( !ctx ) |
| | | { |
| | |
| | | pthread_exit(NULL); |
| | | } |
| | | |
| | | clifd = *(int *)ctx; |
| | | clifd = (int)ctx; |
| | | |
| | | printf("Child thread start to commuicate with socket client...\n"); |
| | | |
| | |
| | | rv=read(clifd, buf, sizeof(buf)); |
| | | if( rv < 0) |
| | | { |
| | | printf("Read data from client sockfd[%d] failure: %s\n", clifd, strerror(errno)); |
| | | printf("Read data from client sockfd[%d] failure: %s and thread will exit\n", clifd, strerror(errno)); |
| | | close(clifd); |
| | | pthread_exit(NULL); |
| | | } |
| | | else if( rv == 0) |
| | | { |
| | | printf("Socket[%d] get disconnected\n", clifd); |
| | | printf("Socket[%d] get disconnected and thread will exit.\n", clifd); |
| | | close(clifd); |
| | | pthread_exit(NULL); |
| | | } |
| | |
| | | { |
| | | printf("Read %d bytes data from Server: %s\n", rv, buf); |
| | | } |
| | | |
| | | /* convert letter from lowercase to uppercase */ |
| | | for(i=0; i<rv; i++) |
| | | { |
| | | buf[i]=toupper(buf[i]); |
| | | } |
| | | |
| | | rv=write(clifd, buf, rv); |
| | | if(rv < 0) |
| | | { |
| | | printf("Write to client by sockfd[%d] failure: %s\n", clifd, strerror(errno)); |
| | | printf("Write to client by sockfd[%d] failure: %s and thread will exit\n", clifd, strerror(errno)); |
| | | close(clifd); |
| | | pthread_exit(NULL); |
| | | } |