socket编程---之多连接服务端实现(多线程方式)

来源:互联网 发布:用友软件t3普及版安装 编辑:程序博客网 时间:2024/05/22 03:24

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/fcntl.h>#include <sys/select.h>#include <sys/time.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <pthread.h>#define Port  2125#define MAXQUEUE   5#define BUFFER_SIZE 1024#define SOCK_NULL -1void *rec_data(void *socketFD){    int client_sockfd;    size_t byte;    char char_recv[100];//存放数据    client_sockfd=*((int*)socketFD);    for(;;)    {        if((byte=recv(client_sockfd,char_recv,sizeof(char_recv),0))==-1)        {            perror("recv");            exit(EXIT_FAILURE);        }        if(strcmp(char_recv, "exit")==0)//接受到exit时,跳出循环            break;        printf("receive from client is %s\n",char_recv);//打印收到的数据    }    free(socketFD);    close(client_sockfd);    pthread_exit(NULL);}int main(){    int server_sockfd;    int *client_sockfd; // --每次获取到新的连接,都分配不同的内存来保存,这样不同的连接数据不会覆盖.当然也可以用一个数组来维护不同的客户端socket        // --1. 创建一个服务端socket    server_sockfd = socket(AF_INET,SOCK_STREAM, 0);    if (server_sockfd == SOCK_NULL) {        perror("socet create....\n");        exit(0);    }        // --2.定义基于internet通信的地址信息 sockaddr_in    struct sockaddr_in server_sockaddr;    server_sockaddr.sin_family = AF_INET;    server_sockaddr.sin_port = htons(Port);    server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // --htonl(INADDR_LOOPBACK)     bzero(&server_sockaddr.sin_zero, sizeof(server_sockaddr.sin_zero));        // --3.bind,成功返回0,出错返回-1    int reuse;    if (setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)) == -1){        perror("setsockopt");        exit(1);    }    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)    {        perror("bind");        exit(1);    }        // --4.listen    if(listen(server_sockfd,MAXQUEUE) == -1)    {        perror("listen");        exit(1);    }            // --5.不停的等待接受客户端的连接,每当获取一个连接时,创建一个子线程,用于处理和这个客户端的数据交互    while(1)    {        struct sockaddr_in client_add;        socklen_t client_len = sizeof(client_add);        client_sockfd = (int*)malloc(sizeof(int));        *client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_add,&client_len);        if (*client_sockfd == SOCK_NULL) {            perror("accept\n");            continue;        }                // --创建子线程        pthread_t client_thread;        if(pthread_create(&client_thread, NULL, rec_data, client_sockfd) == -1){  // --第二个参数表示要创建线程的属性,NULL表示默认属性            perror("create thread\n");            break;        }    }    close(server_sockfd);    return 0;}


0 0
原创粉丝点击