cuốn sách gpt4 ai đã làm

Có vẻ như pthread_create đang ghi đè chuỗi trước đó

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:29:12 28 4
mua khóa gpt4 Nike

Tôi đang cố gắng viết ứng dụng khách trò chuyện loại IRC có ứng dụng khách có thể kết nối với máy chủ. Tôi đang cố gắng làm cho nó hoạt động cục bộ (sử dụng FIFOS thay vì ổ cắm).

Tôi gặp phải vấn đề sau mà dường như tôi không thể giải quyết được:

Sau khi chấp nhận kết nối máy khách mới, tôi muốn tạo một luồng mới cho máy khách đó (trên máy chủ) để xử lý đầu vào từ máy khách đó.

Để làm điều này tôi có đoạn mã sau (mã đầy đủ ở phía dưới):

while(1) {
.
.
.
if (pthread_create(&thread, NULL, client_handler, &new_client) != 0)
printf("Không thể tạo thread để lắng nghe khách hàng.... Không ổn \n");
}

Điều này hoạt động cho 1 khách hàng được kết nối.

Khi tôi cố gắng kết nối với một máy khách khác, có vẻ như phương thức này được thực thi client_handler Chủ đề trước ngừng chạy. Tôi biết điều này là do máy chủ đã ngừng chấp nhận đầu vào từ máy khách đó, nhưng luồng mới hoạt động tốt (chuỗi xử lý các máy khách mới được kết nối).

Tôi tự hỏi liệu cách tiếp cận của tôi sai hay tôi sử dụng pthread_create không chính xác. Có ai có bất cứ đề nghị?

void server_listen() {
Khách hàng new_client;
ClientNodetemp;
buffint client_name_length;
char client_name[CLIENT_NAME_SIZE];
char fifo_in[FIFO_NAME_SIZE], fifo_out[FIFO_NAME_SIZE];
đánh giá cao client_pid;
char ack[4] = "/ack";
char inuse[6] = "/inuse";
chủ đề pthread_t;
chiều dài trâu;
ClientNode nó;
tin nhắn_length mạnh mẽ;
tin nhắn char[MESSAGE_LENGTH];
pthread_mutexattr_t attr;

trong khi (1) {
bộ nhớ (tên_khách_hàng, 0, CLIENT_NAME_SIZE);
client_name_length.data =0;
if (read_helper(irc_server.server_fifo, client_name_length.buff,
sizeof(int)) == -1)
trả về; /* lỗi */
if (read_helper(irc_server.server_fifo, client_pid.buff, sizeof(int))
== -1)
trả về; /* lỗi */
if (read_helper(irc_server.server_fifo, client_name, client_name_length.data) == -1)
trả về; /* lỗi */

pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&new_client.fifo_in_lock, &attr);

printf("Đọc từ một client mới, có tên: %s\n", client_name);
new_client.pid = client_pid.data;
strncpy(new_client.name, client_name, client_name_length.data);
new_client.name_length = client_name_length.data;
sprintf(fifo_in, "fifo-%d-in", client_pid.data);
sprintf(fifo_out, "fifo-%d-out", client_pid.data);
new_client.fifo_in = open(fifo_in, O_WRONLY);
nếu (new_client.fifo_in == -1)
trả về; /* lỗi */
new_client.fifo_out = open(fifo_out, O_RDONLY);
nếu (new_client.fifo_out == -1)
trả về; /* lỗi */

read_lock();
temp = client_exists_by_name(&irc_server.clients, client_name, client_name_length.data);
read_unlock();

nếu (temp != NULL) {
pthread_mutex_lock(&new_client.fifo_in_lock);
chiều dài.data = 6;
if (write_helper(new_client.fifo_in, length.buff, sizeof(int))
== -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf( "Việc ghi vào fifo-out không thành công vì một số lý do không xác định \n");
return;
}
if (write_helper(new_client.fifo_in, inuse, length.data) == -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf( "Việc ghi vào fifo-out không thành công vì một số lý do không xác định \n");
return;
}
pthread_mutex_unlock(&new_client.fifo_in_lock);
continue;
}


write_lock();
Insert_node(&irc_server.clients, new_client);
write_unlock();

chiều dài.data = 4;

pthread_mutex_lock(&new_client.fifo_in_lock);
if (write_helper(new_client.fifo_in, length.buff, sizeof(int)) == -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf("Việc ghi vào fifo-out không thành công vì một số lý do không xác định \n");
return;
}
if (write_helper(new_client.fifo_in, ack, length.data) == -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf("Việc ghi vào fifo-out không thành công vì một số lý do không xác định \n");
return;
}
pthread_mutex_unlock(&new_client.fifo_in_lock);


foreach(it, irc_server.clients){
pthread_mutex_lock(&it->client.fifo_in_lock);

strncpy(tin nhắn, new_client.name, new_client.name_length);
strncat(tin nhắn, "đã tham gia trò chuyện", sizeof("đã tham gia trò chuyện"));
message_length.data = sizeof("đã tham gia trò chuyện") + new_client.name_length;
if (write_helper(it->client.fifo_in, message_length.buff, sizeof(int)) == -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf("ghi vào fifo_in một tin nhắn công khai ERROR1 \n");
return;
}
if (write_helper(it->client.fifo_in, message, message_length.data) == -1) {
//TODO: Chúng ta phải làm gì nếu việc ghi vào fifo_out không thành công?
printf("ghi vào fifo_in một tin nhắn công khai ERROR2 \n");
return;
}
pthread_mutex_unlock(&it->client.fifo_in_lock);
memset(tin nhắn, 0, MESSAGE_LENGTH);
message_length.data = 0;
}

if (pthread_create(&thread, NULL, client_handler, &new_client) != 0)
printf("Không thể tạo thread để lắng nghe khách hàng.... Không ổn \n");

if (pthread_create(&thread, NULL,client_handler1 ,&new_client ) != 0)
printf("Không thể tạo thread để lắng nghe khách hàng.... Không ổn \n");
print_clients();
}
}

câu trả lời hay nhất

Có vẻ như bạn đang chia sẻ một phiên bản new_client giữa tất cả các luồng trong máy chủ. Việc gọi pthread_create() không sao chép new_client một cách kỳ diệu. Vì vậy, mọi luồng bạn tạo đều sử dụng cùng một new_client. Vì vậy, khi luồng chính của bạn điền các giá trị cho máy khách thứ hai, luồng xử lý máy khách thứ nhất cũng sẽ cố gắng sử dụng các giá trị đó.

Gán một new_client mới cho mỗi client, điền vào các giá trị và chuyển chúng tới pthread_create(). Tham số đầu tiên trong pthread_create() cũng yêu cầu biến cho mỗi khách hàng.

Khác - Có vẻ như bạn đang truyền dữ liệu nhị phân thô giữa máy khách và máy chủ, chẳng hạn như số nguyên có độ dài chuỗi. Một khi bạn phải bắt đầu tạo ứng dụng khách cho các hệ điều hành khác nhau, công việc này sẽ gây ra cho bạn rất nhiều rắc rối. Tôi thực sự khuyên bạn nên áp dụng công nghệ tuần tự hóa, tốt nhất là ASN.1 (không miễn phí nhưng rất mạnh mẽ) hoặc Bộ đệm giao thức Google (miễn phí nhưng không phong phú hoặc mạnh mẽ).

Về c - có vẻ như pthread_create đang ghi đè chuỗi trước đó, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/20849215/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress