c:套接字从客户端读取味精

时间:2020-05-21 00:50:25

标签: c multithreading sockets websocket

我正在尝试制作一个网络服务器,如果没有connected ...read(),它将首先打印puts()。但是,如果我有这两个功能,则connected ...将在msg之后。我认为该线程可能首先执行readputs,所以我在sleep()之前添加了一个read,但似乎不起作用。而且我不确定线程​​池是否正确。


#define PORT 9000
#define BUFSIZE 4096
#define SOCKETERROR (-1)
#define NUMBEROFCONNECT 1
#define SIZE_OF_POOL 20
char buffer [1024];
//declare
pthread_t thread_pool[SIZE_OF_POOL];
pthread_mutex_t locker;
void* handle_connection(void* p_client_socket);
void* pfuntion(void* arg);
//make the function

//For the pool
struct Node{
    struct Node* next;
    int *client_socket;
};

struct Node* head=NULL;


void add(int *client_socket){

    if(head==NULL){

        head = malloc(sizeof(struct Node));
        head->client_socket=client_socket;
        head->next=NULL;  
    }
    else{
        struct Node* current=head;
        while(current->next!=NULL){
            current=current->next;
        }
        current->next=malloc(sizeof(struct Node));
        current->next->client_socket=client_socket;
        current->next->next=NULL;
    }   
}

int* delete(){
    if(head==NULL){
        return NULL;
    }
    else{
        int *result=head->client_socket;
        struct Node *temp=head;
        head=head->next;
        free(temp);
        return result;
    }
}

int checksocket(int exp){
    if(exp==SOCKETERROR){
        printf("fool\n");
        exit(1);
    }
    return exp;
}

void* handle_connection(void* p_client_socket){
    puts("connected ...... ");
    return (void*)98;
}

void* pfuntion(void* arg){
    while(1){
        pthread_mutex_lock(&locker);
        int *pclient=delete();
        pthread_mutex_unlock(&locker);

        if(pclient!=NULL){
            //线程做的具体方法
            handle_connection(pclient);
        }
    }
    return (void*)99;

}


int main(int argc,char** argv){

    pthread_mutex_init (&locker,NULL);
    int address_size;
    int server_socket;
    int client_socket;

    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    for(int i=0;i<SIZE_OF_POOL;i++){

        pthread_create(&(thread_pool[i]),NULL,pfuntion,NULL);
    }

    checksocket(server_socket=socket(AF_INET,SOCK_STREAM,0));

    server_address.sin_family=AF_INET;
    server_address.sin_addr.s_addr=INADDR_ANY;
    server_address.sin_port=htons(PORT);

    checksocket(bind(server_socket,(struct sockaddr*)&server_address,sizeof(server_address)));
    checksocket(listen(server_socket,NUMBEROFCONNECT));


    while(1){
        address_size=sizeof(struct sockaddr_in);
        checksocket(client_socket=accept(server_socket,(struct sockaddr*)&client_address,(socklen_t*)&address_size));
        // 
        int*pclient=malloc(sizeof(int));
        *pclient=client_socket;
        pthread_mutex_lock(&locker);
        add(pclient);
        //sleep(1);
        read(client_socket,buffer, 1024);
        puts(buffer);
        pthread_mutex_unlock(&locker);
    }
    return 0;
}


0 个答案:

没有答案