C语言实现多线程和多进程服务器

来源:互联网 发布:服装设计知乎 编辑:程序博客网 时间:2024/06/03 23:50

c语言实现多线程和多进程服务器

多线程

服务端

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <sys/types.h>#include <sys/socket.h>#include <pthread.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#define SERV_PORT 10000#define SERV_IP "127.0.0.1"#define MAX_LISTEN_LEN 128//定义结构体,用于传个threadstruct RA{    int connfd;    struct sockaddr_in cli_addr;};//处理函数,回显服务器void *thread_func(void *arg){    struct RA *tmpRA = (struct RA *)arg;    char buf[BUFSIZ] = {0};    while(1)    {        memset(buf,0,sizeof(buf));        read(tmpRA->connfd,buf,sizeof(buf));        //printf("client ipaddress is %s\n",inet_ntop(AF_INET,&(tmpRA->cli_addr.sin_addr),NULL,0));        printf("client send is %s\n",buf);        write(tmpRA->connfd,buf,sizeof(buf));    }    close(tmpRA->connfd);    free(tmpRA);}int main(){    struct sockaddr_in serv_addr;    struct sockaddr_in cli_addr;    int clilen = sizeof(cli_addr);    int listenfd,connfd;    pthread_t thid;    struct RA *threadRa = NULL;    //初始化    memset((void *)&serv_addr,0,sizeof(serv_addr));    memset((void *)&cli_addr,0,sizeof(cli_addr));    //serv_addr初始化    serv_addr.sin_family = AF_INET;    serv_addr.sin_port = htons(SERV_PORT);    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);    listenfd = socket(AF_INET,SOCK_STREAM,0);    bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));    listen(listenfd,MAX_LISTEN_LEN);    while(1)    {        connfd = accept(listenfd,(struct sockaddr*)&cli_addr,&clilen);        threadRa = (struct RA *)malloc(sizeof(struct RA));        threadRa->connfd = connfd;        memcpy(&threadRa->cli_addr,&cli_addr,clilen);        //把监听返回的套接字交给线程去处理自己继续监听        pthread_create(&thid,NULL,thread_func,(void *)threadRa);        pthread_detach(thid);    }    return 0;}

客户端

#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>#include <netinet/in.h>#include <string.h>#define SERV_IP "127.0.0.1"#define SERV_PORT 10000int main(){    struct sockaddr_in serv_addr;    memset((void *)&serv_addr,0,sizeof(struct sockaddr_in));    char recvbuf[BUFSIZ] = {0};    char buf[BUFSIZ] = {0};    //初始化服务端的参数    serv_addr.sin_family = AF_INET;    serv_addr.sin_port = htons(SERV_PORT);    inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr);    int connfd = socket(AF_INET,SOCK_STREAM,0);    int n = connect(connfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));    if(n == -1)    {        sprintf(stderr,"client connect err");        return -1;    }    while(1)    {        memset(buf,0,sizeof(buf));        memset(recvbuf,0,sizeof(recvbuf));        read(STDIN_FILENO,buf,sizeof(buf));        write(connfd,buf,strlen(buf));        int readlen = read(connfd,recvbuf,sizeof(recvbuf));        recvbuf[readlen] = '\0';        printf("recvbuf is %s\n",recvbuf);    }    return 0;}
0 0
原创粉丝点击