我正在尝试制作一个网络服务器,如果没有connected ...
和read()
,它将首先打印puts()
。但是,如果我有这两个功能,则connected ...
将在msg之后。我认为该线程可能首先执行read
和puts
,所以我在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;
}