linux网络通信之concurrency模型pthread

来源:互联网 发布:交友网站多语言源码 编辑:程序博客网 时间:2024/05/16 14:29

害羞客户端

/*************************************************************************> File Name: client.c> Author: 联合作战实验室> Email: v.manstein@qq.com > Created Time: Fri 24 Mar 2017 07:57:28 AM PDT ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#define err_log(errlog) do {printf("%s:%s, %d\n", __FILE__, __func__, __LINE__);\perror(errlog); }while(0)#define N 128int main(int argc, const char *argv[]){int sockfd; int acceptfd;char buf[N] = {};struct sockaddr_in servervaddr;socklen_t addrlen = sizeof(struct sockaddr_in);if(argc < 3) {fprintf(stderr, "usage: %s serverip port.\n", argv[0]);return -1;}if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0) {err_log("socket error: ");}servervaddr.sin_family = AF_INET;servervaddr.sin_addr.s_addr = inet_addr(argv[1]);servervaddr.sin_port = htons(atoi(argv[2]));if(connect(sockfd, (struct sockaddr*)&servervaddr, sizeof(servervaddr)) < 0) {err_log("connect error: ");}printf("client connect server success.\n");while(1) {printf("Input: ");fgets(buf, N, stdin);buf[strlen(buf) - 1] = '\0';if(send(sockfd, buf, N, 0) < 0) {err_log("send error: ");}if(strncmp(buf, "quit", 4) == 0) {break;}if(recv(sockfd, buf, N, 0) <= 0) {err_log("recv error: ");}printf("From server: %s\n", buf);}close(sockfd);return 0;}
害羞服务器

/*************************************************************************> File Name: server.c> Author: 联合作战实验室> Email: v.manstein@qq.com > Created Time: Fri 24 Mar 2017 07:57:28 AM PDT ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#include<signal.h>#include<sys/wait.h>#include<pthread.h>#define err_log(errlog) do {printf("%s:%s, %d\n", __FILE__, __func__, __LINE__);\perror(errlog); }while(0)#define N 128#define LISTENQUEUE 5int sockfd; int acceptfd;char buf[N] = {};void *handle_client(void* args){int clientfd = (int)args;while(1) {if(recv(clientfd, buf, N, 0) < 0) {err_log("recv error: ");}printf("Receive form client: %s\n", buf);if(strncmp(buf, "quit", 4) == 0) {break;}strcat(buf, " form server.");if(send(clientfd, buf, N, 0) < 0) {err_log("send error: ");}}close(acceptfd);pthread_exit(NULL);}int main(int argc, const char *argv[]){pthread_t tid;struct sockaddr_in servervaddr, clientaddr;socklen_t addrlen = sizeof(struct sockaddr_in);if(argc < 3) {fprintf(stderr, "usage: %s serverip port.\n", argv[0]);return -1;}if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0) {err_log("socket error: ");}servervaddr.sin_family = AF_INET;servervaddr.sin_addr.s_addr = inet_addr(argv[1]);servervaddr.sin_port = htons(atoi(argv[2]));if(bind(sockfd, (struct sockaddr*)&servervaddr, sizeof(servervaddr)) < 0) {    err_log("bind error: ");}    if(listen(sockfd, LISTENQUEUE) < 0) {        err_log("listen error: ");    }printf("server init ok.\n");while(1) {// 主线程负责接收客户端的链接请求if((acceptfd = accept(sockfd, (struct sockaddr*)&clientaddr, &addrlen)) < 0) {err_log("accept error: ");}printf("new client connect ---> acceptfd: %d - %s %d\n", acceptfd, inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));// 每有一个新客户端上线,创建线程负责处理新链接的通信if((pthread_create(&tid, NULL, handle_client, (void*)acceptfd)) < 0) {close(acceptfd);err_log("pthread_create error: ");} }    close(sockfd);    close(acceptfd);return 0;}



0 0
原创粉丝点击