在C程序中跨套接字实现多线程时遇到问题

在C程序中跨套接字实现多线程时遇到问题,c,multithreading,sockets,pthreads,C,Multithreading,Sockets,Pthreads,我正在用C语言创建一个使用套接字和线程的客户机-服务器聊天程序,但在实现多线程时遇到了一个问题。我目前得到的是一个服务器,它使用到目前为止仍在工作的套接字从客户端获取连接,问题是当我尝试创建多个线程来处理发送和接收时 当客户机成功连接到服务器套接字时,在到达客户机程序的主while循环之前,在客户机中创建一个线程,用于处理接收消息“connected to server id:x” 当客户机到达服务器时,将在服务器中创建一个线程来处理数据的发送 他们似乎工作正常,但这是执行令,让我。当我将客户机

我正在用C语言创建一个使用套接字和线程的客户机-服务器聊天程序,但在实现多线程时遇到了一个问题。我目前得到的是一个服务器,它使用到目前为止仍在工作的套接字从客户端获取连接,问题是当我尝试创建多个线程来处理发送和接收时

当客户机成功连接到服务器套接字时,在到达客户机程序的主while循环之前,在客户机中创建一个线程,用于处理接收消息“connected to server id:x”

当客户机到达服务器时,将在服务器中创建一个线程来处理数据的发送

他们似乎工作正常,但这是执行令,让我。当我将客户机连接到服务器时,我认为会发生的事情是,创建用于接收来自服务器的消息的线程将执行主while循环。但是,线程似乎正在等待主循环获取输入

// CURRENT CLIENT CODE - only including threading code

void * client_receive(void * sockID) {
    int network_socket = *((int *) sockID);

    while(1) {
       char data[1024];
       recv(network_socket, data, 1024, 0);
       printf("%s", data);
    }
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, client_receive, (void *) &network_socket);

    while(1) {
        printf("type a message: ");
        scanf("%s", message);
        send(network_socket, message, 1024, 0);
    }
}

________________________________________________________________________________
// CURRENT SERVER CODE
struct client {
    int index;
    int sockID;
    struct sockaddr_in clientAddr;
    int len;
};

void * client_interact(void * client_detail) {
    struct client* client_Detail = (struct client*) client_detail;
    int index = client_Detail -> index;
    int clientSocket = client_Detail -> sockID;
    index = index + 1;

    printf("Client connected");
    char message[1024] = "Welcome!";
    send(clientSocket, message, 1024, 0);

    while(1) {
        char receive[1024];
        recv(clientSocket, &receive, 1024, 0);
        printf("Client: %s", receive);
    }
}

struct client Client[1024];
pthread_t thread[1024];

int main() {

    while(1) {
        pthread_create(&thread[client_count], NULL, client_interact, (void *) &Client[client_count]);

        client_count++;
    }

    for (int i = 0; i < client_count; i++) {
        pthread_join(thread[i], NULL);
    }
    return 0;
}

//当前客户端代码-仅包括线程代码
void*客户端接收(void*sockID){
int-network_-socket=*((int*)sockID);
而(1){
字符数据[1024];
recv(网络插座,数据,1024,0);
printf(“%s”,数据);
}
}
int main(){
pthread\u t线程;
pthread_create(&thread,NULL,client_receive,(void*)和network_socket);
而(1){
printf(“键入消息:”);
scanf(“%s”,消息);
发送(网络_套接字,消息,1024,0);
}
}
________________________________________________________________________________
//当前服务器代码
结构客户端{
整数指数;
int-sockID;
clientAddr中的结构sockaddr_;
内伦;
};
void*客户端交互(void*客户端详细信息){
结构客户端*客户端详细信息=(结构客户端*)客户端详细信息;
int index=客户详细信息->索引;
int clientSocket=client\u Detail->sockID;
指数=指数+1;
printf(“客户连接”);
字符消息[1024]=“欢迎!”;
发送(clientSocket,message,1024,0);
而(1){
字符接收[1024];
recv(clientSocket和receive,1024,0);
printf(“客户端:%s”,接收);
}
}
结构客户端[1024];
pthread_t thread[1024];
int main(){
而(1){
pthread_create(&thread[client_count],NULL,client_interactive,(void*)和client[client_count]);
客户端计数++;
}
对于(int i=0;i

我是否误解了线程的执行?我认为“client_receive”将在主打印“键入消息”之前在创建的线程上执行

main
中的
循环时,实际上不可能判断
client_receive
是否在
之前执行;这由调度程序决定。但是,
client\u receive
在从套接字接收到一些数据之前不会打印任何内容,因此除非您的客户端向服务器发送一些数据,
client\u receive
函数将在调用
recv
时阻塞

因此,虽然您的程序似乎在运行
client\u receive
之前正在等待输入,但可能是
client\u receive
正在阻止对
recv
的调用,而您的主线程正在等待输入

如果您的客户机实际上正在发送数据,而您的服务器似乎没有响应该数据,则可能是客户机端存在某种缓冲。因此,确保
flush
客户端的套接字强制将数据推送到服务器,从而调用
recv



旁注:我假设您实际设置套接字连接并将句柄存储到
network\u socket
中的代码没有包含在内,否则可能会出现问题

我留下了处理套接字的代码,只是为了让它更容易阅读(应该更清楚)。初始连接后似乎出现了死锁,服务器和客户端都确认连接,但在其中一个连接终止之前,服务器和客户端都不会发送或接收数据,然后另一个接收发送的任何数据在发送数据后,您是否尝试在客户端上刷新套接字?是的,也不会打印任何东西,只是等待一些我无法解决的问题。你也可以包括你的客户代码吗?这可能是因为客户端和主线程之间没有同步,所以两者都将同时执行。所以你可能会看到它们的任意顺序。哦,好吧,你会建议使用互斥锁吗?这取决于你想做什么。如果你想修复顺序,你可以使用一些锁,但是不使用线程可能更容易。不幸的是,这是这个项目的一个要求。虽然,这一点上的顺序很烦人,但它并不能解释我得到的死锁。您所展示的代码目前没有明显的死锁问题——您需要创建一个显示死锁发生方式的代码。