C:pthread无法在套接字上侦听、绑定和接受

C:pthread无法在套接字上侦听、绑定和接受,c,multithreading,sockets,network-programming,C,Multithreading,Sockets,Network Programming,我正在尝试创建一个进程来侦听套接字上的连接。当我在main()函数中绑定、侦听和等待接受时,它似乎可以工作。但是,当我尝试创建一个新线程并在该新线程上绑定、侦听和接受时,它失败了。这是我的密码 void request_handler(int clientSock) { FILE *requestedFile = NULL; long fileSize = 0; struct stat st; long bytesRead; char buffer[102

我正在尝试创建一个进程来侦听套接字上的连接。当我在main()函数中绑定、侦听和等待接受时,它似乎可以工作。但是,当我尝试创建一个新线程并在该新线程上绑定、侦听和接受时,它失败了。这是我的密码

void request_handler(int clientSock) {
    FILE *requestedFile = NULL;
    long fileSize = 0;
    struct stat st;
    long bytesRead;
    char buffer[1024];

    requestedFile = fopen("/PATH/book.txt", "rb");

    while(!feof(requestedFile)) {
        bytesRead = fread(buffer, 1, sizeof(buffer), requestedFile);
        send(clientSock, buffer, bytesRead, 0);
    }

}

void listener() {
    int server_sock_desc;
    struct sockaddr_in name;

    int client_sock_desc;
    struct sockaddr_in client_name;
    socklen_t addr_size;

    pthread_t handler_thread;

    printf("waiting");

    //connection setup
    server_sock_desc = socket(PF_INET, SOCK_STREAM, 0);


    if(server_sock_desc != -1) {
        memset(&name, 0, sizeof(name));
        name.sin_family = AF_INET;
        name.sin_port = htons(5000);
        name.sin_addr.s_addr = htonl(INADDR_ANY);
        int bind_result = bind(server_sock_desc, (struct sockaddr *) &name, sizeof(name));
        if(bind_result == 0) {
            if(listen(server_sock_desc, BACKLOG) < 0) {
                perror("listen failed");
            }

            addr_size = sizeof(client_name);

            //Server Loop will continue to run listening for clients connecting to the server
            while(1) {

                //new client attempting to connect to the server

                client_sock_desc = accept(server_sock_desc, (struct sockaddr *) &client_name, &addr_size);
                if(client_sock_desc == -1) {
                    if(errno == EINTR) {
                        continue;
                    }
                    else {
                        perror("accept failed");
                        exit(1);
                    }
                }

                //connection starts here

                //create a thread for the new clients request to be handled
                if(pthread_create(&handler_thread, NULL, request_handler, client_sock_desc) != 0) {
                    perror("pthread_create failed");
                }
            }
        }
        else {
            perror("bind failed");
        }
    }
    else {
        perror("socket failed");
    }

}

int main(int argc, const char * argv[])
{
    pthread_t listenerThread;

    if(pthread_create(&listenerThread, NULL,listener, NULL) != 0) {
        perror("Listener thread create failed");
    }
}
void请求\u处理程序(int-clientSock){
FILE*requestedFile=NULL;
长文件大小=0;
结构统计;
漫长的过去;
字符缓冲区[1024];
requestedFile=fopen(“/PATH/book.txt”,“rb”);
而(!feof(requestedFile)){
bytesRead=fread(buffer,1,sizeof(buffer),requestedFile);
发送(clientSock,buffer,bytesRead,0);
}
}
void侦听器(){
int server_sock_desc;
名称为struct sockaddr_;
int client_sock_desc;
客户端名称中的结构sockaddr\u;
袜子尺寸;
pthread\u t handler\u线程;
printf(“等待”);
//连接设置
server_sock_desc=socket(PF_INET,sock_STREAM,0);
如果(服务器\u sock\u desc!=-1){
memset(&name,0,sizeof(name));
name.sin_family=AF_INET;
name.sinu port=htons(5000);
name.sin_addr.s_addr=htonl(INADDR_ANY);
int bind_result=bind(server_sock_desc,(struct sockaddr*)&name,sizeof(name));
if(bind_result==0){
如果(侦听(服务器存储描述、待办事项)<0){
perror(“倾听失败”);
}
地址大小=sizeof(客户名称);
//服务器循环将继续运行,以侦听连接到服务器的客户端
而(1){
//试图连接到服务器的新客户端
client_sock_desc=accept(server_sock_desc,(struct sockaddr*)和client_name以及addr_size);
如果(客户端\u sock\u desc==-1){
如果(errno==EINTR){
持续
}
否则{
perror(“接受失败”);
出口(1);
}
}
//连接从这里开始
//为要处理的新客户端请求创建线程
if(pthread\u create(&handler\u thread,NULL,request\u handler,client\u sock\u desc)!=0){
perror(“pthread_创建失败”);
}
}
}
否则{
perror(“绑定失败”);
}
}
否则{
perror(“套接字失败”);
}
}
int main(int argc,const char*argv[]
{
pthread_t listenerThread;
if(pthread_create(&listenerThread,NULL,listener,NULL)!=0){
perror(“侦听器线程创建失败”);
}
}

奇怪的是,当我试图通过调试器运行它时,有时listener()的一部分会执行,然后突然停止

您需要给线程一个运行的机会。程序在创建线程后立即终止(通过从
main
返回)

如果希望初始线程终止并保持另一个线程运行,请调用
pthread\u exit
,而不是从
main
返回。如果希望该线程等待侦听线程终止,请在侦听线程上调用
pthread\u join


让初始线程从贴图的边缘流出。有龙。

谢谢!我从来没有想到过。我是新来的。几分钟后我会接受的