我已閱讀其他類似問題的答案,但它們都不能解決我的問題。LInux中的C socket編程,雙重免費損壞(fasttop)錯誤
這是我的代碼:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <pthread.h>
typedef struct {
pthread_t thread_id;
int sockfd;
} client_t;
client_t *clients;
size_t client_n = 0;
void *client_thread(void *client_ptr) {
client_t client = *(client_t*) client_ptr;
char buffer[500];
int state;
while(1) {
state = send(client.sockfd, 0, 1, MSG_NOSIGNAL);
if(state == -1) {
printf("socket-%d closed\n", client.sockfd);
break;
}
read(client.sockfd, buffer, 500);
printf("from socket-%d: %s\n", client.sockfd, buffer);
memset(buffer, 0, 500);
}
close(client.sockfd);
free(client_ptr);
client_n--;
}
int main(int argc, char *argv[]) {
int sockfd, newsockfd, clilen;
struct sockaddr_in clientaddr, serveraddr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = INADDR_ANY;
serveraddr.sin_port = htons(8080);
bind(sockfd, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
listen(sockfd, 5);
clilen = sizeof(clientaddr);
clients = (client_t*) malloc(sizeof(client_t));
while(1) {
newsockfd = accept(sockfd, (struct sockaddr*) &clientaddr, &clilen);
printf("New connection: socket-%d\n", newsockfd);
clients = (client_t*) realloc(clients, (client_n + 1) * sizeof(client_t));
clients[client_n].sockfd = newsockfd;
pthread_create(&clients[client_n].thread_id, NULL, client_thread, (void*) &clients[client_n]);
client_n++;
}
return 0;
}
程序應該偵聽傳入的連接,然後創建爲每一個新的線程。該程序將同時處理每個客戶端。由於這應該是遊戲服務器的核心,我創建了一個包含每個玩家信息的結構。
這一切都工作得很好,直到我加入:
close(client.sockfd);
free(client_ptr);
client_n--;
任何想法的問題是什麼?
您的分配已損壞。你分配一個'client_t'數組,但是嘗試釋放單個條目,這是不可能的。只需每次分配一個條目,將其分配給客戶端線程,以便將其釋放。 –