c - Linux线程C服务器

标签 c linux multithreading sockets

我根据在线教程编写了这个服务器。 我的目标是为每个新的客户端连接创建一个新线程。这部分工作正常,但问题是只要其中一个客户端断开连接,服务器程序就会退出。 我做错了什么?

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

void* SocketHandler(void*);

int main(int argv, char** argc){
    int host_port= 1101;
    struct sockaddr_in my_addr;
    int hsock;
    int * p_int ;
    int err;
    socklen_t addr_size = 0;
    int* cs;
    struct sockaddr_in sadr;
    pthread_t thread_id=0;

    hsock = socket(AF_INET, SOCK_STREAM, 0);
    p_int = (int*)malloc(sizeof(int));
    *p_int = 1;

    setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int));
    setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int));
    free(p_int);

    my_addr.sin_family = AF_INET ;
    my_addr.sin_port = htons(host_port);
    memset(&(my_addr.sin_zero), 0, 8);
    my_addr.sin_addr.s_addr = INADDR_ANY ;

    bind( hsock, (struct sockaddr *)&my_addr, sizeof(my_addr));
    listen( hsock, 10);
    addr_size = sizeof( struct sockaddr_in);

while(1){
    printf("waiting for a connection\n");
        cs = (int*)malloc(sizeof(int));
    if((*cs = accept( hsock, (struct sockaddr*)&sadr, &addr_size))!= -1){
        pthread_create(&thread_id,0,&SocketHandler, (void*)cs );
        pthread_detach(thread_id);
    }
    else{
        fprintf(stderr, "Error accepting %d\n", errno);
    }
    }
}

void* SocketHandler(void* lp){
    int *csock = (int*)lp;
    char buffer[1024];
    int buffer_len = 1024;
    int bytecount;
    while (1){
    memset(buffer, 0, buffer_len);
        bytecount = recv(*csock, buffer, buffer_len, 0);
    printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);

    strcat(buffer, " SERVER ECHO");
    bytecount = send(*csock, buffer, strlen(buffer), 0);    
    printf("Sent bytes %d\n", bytecount);
    }
    free(csock);
    return NULL;
}

最佳答案

如果您尝试send() 到已关闭的套接字,信号SIGPIPE 会被触发。如果您不忽略或处理此信号,它将终止进程。

忽略:

sigset(SIGPIPE, SIG_IGN); /* check return value to ensure success. */

要处理您需要定义和指定信号处理函数。

关于c - Linux线程C服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375237/

相关文章:

c - 为什么返回 if 和 else 不起作用

c - 释放 2D 动态内存时出现问题

linux - Linux下/sys/devices下创建文件

linux - Squid3 URL block

c - 除了调用 free() 之外,有没有办法确定指针是否可以传递给 free()?

c - 合并两个未排序的链表?

linux - 自动将文档上传到实时链接(开放文本),无需人工干预

c# - Java 多线程/针对 Mono 的基准测试

android - BitmapFactory.decodeStream 线程安全吗?有时我的异步任务在完成之前完成

多线程模式下的Java集合算法