【发布时间】:2019-04-10 17:13:08
【问题描述】:
我正在尝试使用 C 语言中的 TCP/IP 创建一个聊天室,但每个新客户端都是一个新线程。客户端必须与服务器相互通信。我在创建新线程时遇到问题。
当调用pthread_create(&thread_id, NULL, messenger, (void*)client_socket) 时,我试图传递新客户端的套接字描述符并将其添加到整数数组中。但无论我尝试什么,我都会收到以下警告:
赋值从没有强制转换的指针生成整数
这是我遇到问题的代码。在main 函数中有一个名为users 的全局int 变量:
users = 0;
int new_socket;
int *clinet_socket;
new_socket = accept(master_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen);
client_socket = &new_socket;
pthread_create(&thread_id, NULL, messenger, (void*)client_socket)
这是messenger函数:
void *messenger(void *sockel){
unsigned int (*sockerde)[30];
(*sockerde)[users] = (unsigned int(*))&sockel;
users++;
}
关键是要保存一个包含所有连接客户端的套接字描述符的数组,以便以后使用它。
【问题讨论】:
-
为什么你的函数定义是“int *clinet_socket;”不能是“void *clinet_socket”?
-
messenger函数的多个问题: 1)变量sockel是一个指针,&sockel是一个指向指针的指针。 2)您将sockerde定义为一个指向30无符号整数数组的指针,而不是一个包含30 个指针的数组(如果这是您真正想要的)。 3) 你永远不会初始化指针sockerde,所以取消引用它是未定义的行为。 4)(*sockerde)[users]是unsigned int而(unsigned int(*))&sockel是指针,这是警告消息的来源。 -
还有其他可能的问题,例如一个取决于
new_socket变量的生命周期与线程生命周期的比较。 -
总而言之,您可能应该退后几步,回到初学者书籍或教程中,阅读有关指针及其工作原理的更多信息。
-
哦,最后,当使用
pthread_create时,通常认为可以将值转换为指针,而在函数中进行相反的转换。就像例如pthread_create(&thread_id, NULL, messenger, (void *) (intptr_t) new_socket),在函数int sock = (int) (intptr_t) sockel;
标签: c pointers tcp casting pthreads