【发布时间】:2013-12-20 07:52:39
【问题描述】:
我有一个简单的 C 程序,它应该监听连接并为每个连接的客户端启动一个新线程。该线程只是打印它收到的消息(现在)。我在制作这个时遵循了两个教程。
它有效,但我尝试使用 netcat 反复连接和断开连接,但没有发送任何消息。每次连接时,程序占用 8KB 内存,但断开连接时它只释放 4KB。但我找不到泄漏的原因。每次用户断开连接时,它都会结束线程并关闭套接字。以下是所有涉及的代码:
void* clientFunction(void* arg) {
char receiveBuffer[RECEIVE_BUFFER_SIZE];
long receiveSize;
int clntSocket = * ((int*) arg);
while (true) {
//receive messages
receiveSize = recv(clntSocket, receiveBuffer, RECEIVE_BUFFER_SIZE, 0);
if (receiveSize <= 0) {
close(clntSocket);
return NULL;
}
printf("Received message: %s", receiveBuffer);
memset(&receiveBuffer, 0, sizeof(receiveBuffer));
}
return 0;
}
int main(int argc, const char * argv[]) {
//FOR LISTENING SOCKET =====
int servSock; /* Socket descriptor for server */
int clntSock; /* Socket descriptor for client */
struct sockaddr_in serverAddress; /* Local address */
struct sockaddr_in clientAddress; /* Client address */
unsigned int clntLen; /* Length of client address data structure */
// =======
/* Create socket for incoming connections */
if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
printf("Socket creation failed!\n");
return SOCKET_ERROR;
}
memset(&serverAddress, 0, sizeof(serverAddress)); /* Zero out structure */
serverAddress.sin_family = AF_INET; /* Internet address family */
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
serverAddress.sin_port = htons(PORT); /* Local port */
if (bind(servSock, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
printf("Socket binding failed!\n");
return SOCKET_ERROR;
}
if (listen(servSock, MAXPENDING) < 0) {
printf("Socket listening failed!\n");
return SOCKET_ERROR;
}
isListening = true;
int* arg = &clntSock;
while (isListening) { //should have a timer?
/* Set the size of the in-out parameter */
clntLen = sizeof(clientAddress);
/* Wait for a client to connect */
if ((clntSock = accept(servSock, (struct sockaddr *) &clientAddress, &clntLen)) >= 0) { //??????
/* clntSock is connected to a client! */
pthread_t clientThread;
pthread_create(&clientThread, NULL, &clientFunction, (void*) arg);
}
}
return 0;
}
【问题讨论】:
-
看起来您可能需要调用 pthread_detach。
-
您如何评估是否存在泄漏?可能是某些底层系统(还)没有放弃一些内存,以后可能会重用这些内存。您可以在简单的
malloc后跟free上看到这种情况。最好的测试是运行程序一段时间,看看在每分钟建立 N 个连接时内存使用量是否线性增加。 -
好的,我试试长跑测试。我不知道它会那样做。
-
500 - 内部服务器错误也是正确的。默认情况下,这些线程是可连接的并持有一些资源。加入或分离它们。
-
啊,是的,这就是解决方案。 500 - 内部服务器错误,因为您首先回答,您可以将其作为答案,如果您想要积分,我可以标记。我在套接字关闭行之后放入 pthread_detach(pthread_self()) ,它不再有问题了。
标签: c multithreading sockets memory-leaks