- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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/
我知道 C++ 中的 overriding 是什么。但是,是否存在覆盖?如果有,是什么意思? 谢谢。 最佳答案 在 C++ 术语中,您有 覆盖(与类层次结构中的虚拟方法相关)和 重载(与具有相同名称但
我想捕获位于另一个元素下的元素的鼠标事件。 这是我所拥有的示例:http://jsfiddle.net/KVLkp/13/ 现在我想要的是当鼠标悬停在红色方 block 上时蓝色方 block 有黄色
以下报道 here我尝试创建一个带有重叠散点图的箱线图。 但是当我运行时: In [27]: table1.t_in[table1.duration==6] Out[27]: counter 7
有一个 JS Fiddle here , 你能在不克隆到新对象的情况下替换 e.target 吗? 下面重复了那个 fiddle 的听众; one.addEventListener('click',
首先要解决重复的可能性: 我不是询问 Override 是什么、它的含义或 @Override 在 java 文档注释之外。那是我不是问 /**Some JavaDoc Comment*/ @over
我想要高于定义的数组。它存储点及其坐标。 public static List simpleGraph(List nodes) { int numEdges = nodes.size() *
我在 http://olisan.dk/blog/ 有一个博客- 如您所见,有一个 28 像素的高间隙(边距顶部)...在 style.css 中: margin-top: 0; 也被设置为 marg
Vulkan 句柄是指向 struct 的不透明指针,或者只是无符号的 64 位整数,具体取决于 VK_USE_64_BIT_PTR_DEFINES 的值: #if (VK_USE_64_BI
我正在尝试提供一个行为类似于 DataGridTextColumn 的 DataGrid 列,但在编辑模式下有一个附加按钮。我查看了 DataGridTemplateColumn,但似乎更容易将 Da
使用 Django 1.10 我想在用户名中允许\字符,因为我在使用“django.contrib.auth.middleware.RemoteUserMiddleware”的 Windows 环境中
我正在尝试使用 ffmpeg 将 Logo 放入 rtmp 流中。我的 ffmpeg 版本是 ffmpeg version 4.3.1目前在我的复杂过滤器中,我有: ffmpeg -re -i 'v
是否有用于Firebase 3存储的方法/规则来禁用文件更新或覆盖? 我为数据库找到了data.exists(),但没有为存储找到解决方案。 最佳答案 TL; DR:在Storage Security
我有两个 Docker Compose 文件,docker-compose.yml看起来像这样 version: '2' services: mongo: image: mongo:3.2
我需要覆盖 JPA 中的集合表吗?也许有人有想法 public class nationality{ @Embedded @AttributeOverrides({
嗨,我正在使用 WIX 和下面的代码将文件安装到目录中。 我的应用程序的工作方式是用户可以在该目录中复制他们自己的文件,覆盖他们喜欢的内容
我正在尝试为 Lua 中的字符串实现我自己的长度方法。 我已成功覆盖字符串的 len() 方法,但我不知道如何为 # 运算符执行此操作。 orig_len = string.len function
在Scala 2.10.4中,给出以下类: scala> class Foo { | val x = true | val f = if (x) 100 else 200
我想做上面的事情。 我过去覆盖了许多文件...... block ,模型,助手......但这个让我望而却步。 谁能看到我在这里做错了什么: (我编辑了这段代码......现在包括一些建议......
根据javadoc An instance method in a subclass with the same signature (name, plus the number and the ty
我有一段代码,只要有可用的新数据作为 InputStream 就会生成新数据。每次都覆盖同一个文件。有时文件在写入之前变为 0 kb。 Web 服务会定期读取这些文件。我需要避免文件为 0 字节的情况
Tôi là một lập trình viên xuất sắc, rất giỏi!