Malloc的客户端/服务器问题?
我正在处理的部分任务涉及一个程序,该程序通过套接字执行来自客户端的命令。现在,我唯一需要编辑的文件是my mathServer.c,我目前正在使用提供的说明中的几个部分之一: 完成方法-doServer。doServer应该有一个循环,它在其中等待客户端连接到listenFd。当客户机这样做时,它应该: malloc有足够的内存用于2个整数 将accept中的文件描述符放在其中一个空格中 将threadCount的值放在另一个空格中,并递增 线程数 创建一个分离的线程来处理这个新客户端。我调用了我的函数handleClient,但是你可以调用你的函数。传递malloc-ed数组的地址 然后循环应返回进行另一次接受 这是我的doServer:Malloc的客户端/服务器问题?,c,sockets,malloc,C,Sockets,Malloc,我正在处理的部分任务涉及一个程序,该程序通过套接字执行来自客户端的命令。现在,我唯一需要编辑的文件是my mathServer.c,我目前正在使用提供的说明中的几个部分之一: 完成方法-doServer。doServer应该有一个循环,它在其中等待客户端连接到listenFd。当客户机这样做时,它应该: malloc有足够的内存用于2个整数 将accept中的文件描述符放在其中一个空格中 将threadCount的值放在另一个空格中,并递增 线程数 创建一个分离的线程来处理这个新客户端。我调用了
void doServer (int listenFd)
{
// I. Application validity check:
// II. Server clients:
pthread_t threadId;
pthread_attr_t threadAttr;
int threadCount = 0;
// YOUR CODE HERE
int *a;
while(1) {
//1. If Malloc was NEVER (outside or inside loop) in this program then
// it outputs Thread 0 recieved
a = malloc(sizeof(int) * 2);
accept(getServerFileDescriptor(), NULL, NULL);
// 2.
a[0] = getServerFileDescriptor();
// 3.
a[1] = threadCount++;
// ALL 4
pthread_attr_init(&threadAttr);
pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
pthread_create(&threadId, &threadAttr, handleClient, &a);
pthread_join(threadId, NULL);
pthread_attr_destroy(&threadAttr);
}
}
以下是我的handleClient方法:
void* handleClient(void* vPtr) {
// Use another pointer to cast back to int*
// Save the file descriptor and thread number in local vars
// free() the memory
// I wrote these 2 lines.
int *castMe = (int *)vPtr;
free(vPtr);
// II.B. Read command:
char buffer[BUFFER_LEN];
char command;
int fileNum;
int fd = castMe[0];
int threadNum = castMe[1];
char text[BUFFER_LEN];
int shouldContinue = 1;
while (shouldContinue)
{
text[0] = '\0';
read(fd,buffer,BUFFER_LEN);
printf("Thread %d received: %s\n",threadNum,buffer);
sscanf(buffer,"%c %d \"%[^\"]\"",&command,&fileNum,text);
//printf("Thread %d quitting.\n",threadNum);
return(NULL);
// YOUR CODE HERE
}
}
我发现每当我删除a=mallocsizeofint*2以及与malloc相关的所有内容时,它都会输出线程0。但是,当我保留malloc时,输出只是空白的,不会返回任何内容
起初我认为这是因为我没有释放内存,但内存正在从handleClient中释放,对吗
**请注意,这不是整个计划。你在这里看到的任何方法都是教授们的工作。这两个方法是我自己的代码。假设这些代码可以工作:**
非常感谢您的帮助 你的一段代码
// I wrote these 2 lines.
int *castMe = (int *)vPtr;
free(vPtr);
释放castMe指向的内存,当您使用它时,您将取消对无效内存的引用
int fd = castMe[0]; //<----- BOOM
int threadNum = castMe[1];//<----- BOOM
这是因为a没有指向有效的内存地址。以下是错误:
int *castMe = (int *)vPtr;
free(vPtr);
...
int fd = castMe[0];
您解除分配vPtr指向的内存,然后稍后尝试通过另一个指针访问该内存。此:
pthread_create(&threadId, &threadAttr, handleClient, &a);
^
|
WAT
这是一个问题,因为这里让pthreads库将指向a中第一个元素的指针的地址传递给线程,您的意思是只传递指向a中第一个元素的指针
因此,您应该通过&a[0],它更容易、更清楚地写为a
此调用与随后在线程函数中使用参数的方式不匹配。您可以打印这两者以查看差异:
printf("&a=%p\n", (void *) &a);
然后在函数中添加:
printf("castMe=%p\n", (void *) castMe);
这些值将不同
此外,您的内存处理已关闭,无法释放您仍然需要的数据。在C语言中,您不需要向数据指针和void*进行显式转换,只需执行以下操作:
int * const numbers = vPtr;
有人回答吗?我也在做这个 如何使用另一个指针返回int*?然后当我释放内存时,如果有意义的话,我释放的是哪个指针…@Karth你不释放指针,你释放它们指向的东西。至于演员阵容,这是多余的。@Karth:做你想做的事与指针无关。这是关于记忆的。因此,您不能仅仅创建一个指针来存储以后还必须释放的内存。一旦你使用内存,你就可以释放旧内存。C内存管理非常重要,如何使其有效?我以为我在创建另一个指针,将其转换回int*然后释放内存。问题是:如果需要,为什么要释放内存?@Karth:你需要理解指针(房子的地址)和内存(房子)之间的区别。您为一所房子创建了两个地址。然后你叫一个拆迁队来摧毁房子。然后你告诉邮递员把你的信寄到第二个地址,以为第二个地址会把他带到另一个家。唉,当他到达那里时,他发现了一所被毁的房子。。。您的程序然后崩溃或其他任何情况,行为是未定义的pthread_创建时应该包含哪些内容而不是&a。这不是我的malloc-ed数组的地址吗?@Karth-Oops,我没有直接提到它,修正了。谢谢
int * const numbers = vPtr;