我正在做的这个作业的一部分涉及一个通过套接字从客户端执行命令的程序。现在我唯一需要编辑的文件是我的mathServer.c,我目前停留在提供的说明中的几个部分之一:
完成方法 - doServer()。 doServer() 应该有一个循环,在其中等待客户端连接到 listenFd。当客户端这样做时,它应该:
-
malloc() 内存足以容纳 2 个整数
-
将 accept() 中的文件描述符放在其中一个空格中
-
将 threadCount 的值放在另一个空格中,然后递增 线程计数
-
创建一个分离的线程来处理这个新客户端。我调用了我的函数handleClient(),但你可以调用你的函数。传递 malloc() ed 数组的地址。
然后循环应该返回另一个 accept()。
这是我的服务器:
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);
}
}
这是我的句柄客户端方法:
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] = ' ';
read(fd,buffer,BUFFER_LEN);
printf("Thread %d received: %sn",threadNum,buffer);
sscanf(buffer,"%c %d "%[^"]"",&command,&fileNum,text);
//printf("Thread %d quitting.n",threadNum);
return(NULL);
// YOUR CODE HERE
}
}
我发现每当我删除 = malloc(sizeof(int) * 2) 以及与 malloc相关的所有内容时,它都会输出收到的线程 0。但是,当我保留 malloc 时,输出只是空白的,不会返回任何内容。
起初我以为这是因为我没有释放内存,但是内存正在从handle客户端释放,对吗?
**请注意,这不是整个程序。你在这里看到的任何方法都是教授的工作。这两个方法是我自己的(你的代码在这里)。假设教授的代码:)工作
**任何帮助都非常感谢!
你的一段代码
// I wrote these 2 lines.
int *castMe = (int *)vPtr;
free(vPtr);
free
castMe
指向的内存,当您使用它时,您将取消引用无效内存
int fd = castMe[0]; //<----- BOOM
int threadNum = castMe[1];//<----- BOOM
这是未定义的行为
此外,当你写的时候,我删除了一个 = malloc(sizeof(int) * 2),我想你a
声明保持原样
int *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=%pn", (void *) &a);
然后在函数中添加:
printf("castMe=%pn", (void *) castMe);
值会有所不同。
此外,您的内存处理已关闭,永远不会free()
您仍然需要的数据。在 C 中,您不需要在数据指针和void *
之间进行显式强制转换,您只需执行以下操作:
int * const numbers = vPtr;
这是答案吗?我也在努力!