程序博客网 > 顶级服装品牌 知乎
来源:互联网 发布:顶级服装品牌 知乎 编辑:程序博客网 时间:2024/05/17 04:51
#include <sys/socket.h>#include <unistd.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <pthread.h>#define PORT 4002struct ARG{int accepted_fd;struct sockaddr_in client;};void * do_thread(void *arg);pthread_key_t key;pthread_once_t once = PTHREAD_ONCE_INIT;static void destructor(void *ptr){free(ptr);}static void createkey_once(void){pthread_key_create(&key, destructor);}main(int argc,char *argv[]){pthread_t tid;int listen_socket_id,accept_socket_id;int addrlen, iBytes;struct sockaddr_in server, client;struct ARG * arg;if(argc < 3){printf("Too less parameters/n");printf("Usage: ./tcp_server ip port/n");_exit(0);}if((listen_socket_id = socket(AF_INET, SOCK_STREAM, 0))== -1){perror("Error--socket:");_exit(-1);}bzero(&server, sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(atoi(argv[2]));if(strcmp(argv[1],"0")==0)server.sin_addr.s_addr = htonl(INADDR_ANY);elseserver.sin_addr.s_addr = inet_addr(argv[1]);int opt = SO_REUSEADDR;setsockopt(listen_socket_id,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if(bind(listen_socket_id,(struct sockaddr *)&server, sizeof(server)) == -1){perror("Error-bind:");close(listen_socket_id);_exit(-2);}if(listen(listen_socket_id, 5) == -1){perror("Error-listen:");close(listen_socket_id);_exit(-3);}addrlen = sizeof(addrlen);for(;;){if((accept_socket_id = accept(listen_socket_id, (struct sockaddr *)&client, &addrlen)) == -1){perror("Error-accept:");close(listen_socket_id);_exit(-4);}arg = (struct ARG *)malloc(sizeof(struct ARG));arg->accepted_fd = accept_socket_id;memcpy((void *)&arg->client,(void *)&client,sizeof(client));if(pthread_create(&tid,NULL,do_thread,(void *)&arg)){perror("pthread_create() error");close(accept_socket_id);close(listen_socket_id);_exit(-5);}}close(listen_socket_id);}void * do_thread(void *arg1){int iBytes;unsigned char buf[256];struct ARG *arg;arg = (struct ARG *)arg1;bzero(buf,256);iBytes = read(arg->accepted_fd, buf, 256);if(iBytes == -1){perror("Error-recv:");close(arg->accepted_fd);pthread_exit(NULL);}printf("[%s:%d]发来连接请求:%s/n",inet_ntoa(arg->client.sin_addr),ntohs(arg->client.sin_port),buf);if(write(arg->accepted_fd,"Welcome, baby!/n",15) == -1){perror("Error-send:");close(arg->accepted_fd);pthread_exit(NULL);}close(arg->accepted_fd);pthread_exit(NULL);}