#vim tcp_thr_server.c #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 4002 struct ARG{ int accepted_fd; struct sockaddr_in client; }; void * do_process(void *arg); 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); else server.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_process,(void *)&arg)){ perror("pthread_create() error"); close(accept_socket_id); close(listen_socket_id); _exit(-5); } } close(listen_socket_id); } void * do_process(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); }