- 论坛徽章:
- 0
|
现在能连多个客户端,但是一个客户端ctrl+c关闭,起的服务也会自己关,不知道怎么回事了,求指点,线程刚学!- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <termios.h>
- #include <errno.h>
- #include <sys/unistd.h>
- #include <sys/socket.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <signal.h>
- #include <netinet/in.h>
- #include <sys/wait.h>
- #include <stdarg.h>
- #include <netdb.h>
- #include <netinet/ip_icmp.h>
- #include <math.h>
- #include <netinet/in.h>
- #include <sys/time.h>
- #include <pthread.h>
- #define HELLO_WORLD_SERVER_PORT 6666
- #define LENGTH_OF_LISTEN_QUEUE 20
- #define BUFFER_SIZE 1024
- #define THREAD_MAX 5
- void * talk_to_client(void *data)
- {
- int new_server_socket = (int)data;
- char buffer[BUFFER_SIZE];
- while(1){
- bzero(buffer, BUFFER_SIZE);
- strcpy(buffer,"Hello,World! 从服务器来!");
- strcat(buffer,"\n"); //C语言字符串连接
- //发送buffer中的字符串到new_server_socket,实际是给客户端
- send(new_server_socket,buffer,BUFFER_SIZE,0);
- bzero(buffer,BUFFER_SIZE);
- sleep(1);
- printf("-----client----------- %d\n",test_i);
- //接收客户端发送来的信息到buffer中
- #if 1
- int length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
- if (length <0) {
- printf("Server Recieve Data Failed!\n");
- exit(1);
- }
- printf("\nSocket Num: %d \t %s",new_server_socket, buffer);
- #endif
- }
- printf("1122222111111111\n");
- close(new_server_socket);
- pthread_exit(NULL);
- }
- int main(int argc, char **argv)
- {
- //设置一个socket地址结构server_addr,代表服务器internet地址, 端口
- struct sockaddr_in server_addr;
- int new_server_socket=-1;
- time_t t1,t2;
- fd_set fdR;
- struct timeval timev;
- int maxfd;
- struct sockaddr_in client_addr;
- pthread_t child_thread;
- pthread_attr_t child_thread_attr;
- bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = htons(INADDR_ANY);
- server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
- //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
- int server_socket = socket(AF_INET,SOCK_STREAM,0);
- if( server_socket <0) {
- printf("Create Socket Failed!");
- exit(1);
- }
- //把socket和socket地址结构联系起来
- if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {
- printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
- exit(1);
- }
- //server_socket用于监听
- if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) {
- printf("Server Listen Failed!");
- exit(1);
- }
- int i,ret;
- while(1) //服务器端要一直运行
- {
- FD_ZERO(&fdR);
- FD_SET(server_socket, &fdR);
- maxfd=server_socket;
- timev.tv_sec = 0;
- timev.tv_usec = 5000;
- ret = select(maxfd+1, &fdR, NULL, NULL, &timev);
- if (ret < 0) {
- printf("select delay\n");
- continue;
- }
- if(FD_ISSET(server_socket,&fdR)) {
- //定义客户端的socket地址结构client_addr
- socklen_t length = sizeof(client_addr);
- //接受一个到server_socket代表的socket的一个连接
- //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
- //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
- //new_server_socket代表了服务器和客户端之间的一个通信通道
- //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
- new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
- if ( new_server_socket <0) {
- printf("Server Accept Failed!\n");
- break;
- } else {
- // pthread_attr_init(&child_thread_attr);
- // pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
- if( pthread_create(&child_thread,NULL,talk_to_client, (void *)new_server_socket) <0 )
- printf("pthread_create Failed : %s\n",strerror(errno));
- }
- }
- }
- //关闭监听用的socket
- printf("11111111111111111\n");
- close(server_socket);
- return 0;
- }
复制代码 |
|