Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Malloc的客户端/服务器问题?_C_Sockets_Malloc - Fatal编程技术网

Malloc的客户端/服务器问题?

Malloc的客户端/服务器问题?,c,sockets,malloc,C,Sockets,Malloc,我正在处理的部分任务涉及一个程序,该程序通过套接字执行来自客户端的命令。现在,我唯一需要编辑的文件是my mathServer.c,我目前正在使用提供的说明中的几个部分之一: 完成方法-doServer。doServer应该有一个循环,它在其中等待客户端连接到listenFd。当客户机这样做时,它应该: malloc有足够的内存用于2个整数 将accept中的文件描述符放在其中一个空格中 将threadCount的值放在另一个空格中,并递增 线程数 创建一个分离的线程来处理这个新客户端。我调用了

我正在处理的部分任务涉及一个程序,该程序通过套接字执行来自客户端的命令。现在,我唯一需要编辑的文件是my mathServer.c,我目前正在使用提供的说明中的几个部分之一:

完成方法-doServer。doServer应该有一个循环,它在其中等待客户端连接到listenFd。当客户机这样做时,它应该:

malloc有足够的内存用于2个整数

将accept中的文件描述符放在其中一个空格中

将threadCount的值放在另一个空格中,并递增 线程数

创建一个分离的线程来处理这个新客户端。我调用了我的函数handleClient,但是你可以调用你的函数。传递malloc-ed数组的地址

然后循环应返回进行另一次接受

这是我的doServer:

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;