C で簡単なチャット サービス (ソケット プログラミング) を作成しようとしています。サーバーは同時接続であり、複数の接続を受け入れることができます。サーバーのスレッドとリンクされたリストを使用して、ソケット ID を保存します。リンクされたリストからノードを削除するために使用する削除機能を除いて、すべて正常に動作します。クライアントが を入力するたびに、DONE
そのソケット ID をリンク リストから削除する必要がありますが、正しく機能しません。誰かが私が削除機能で何をしなければならないかを理解するのを手伝ってくれませんか.
ここに私の構造があります:
struct ClientList {
struct ClientList *Next;
int socket;
char username[100];
int count;
FILE *file;
} ;
ここにノードを追加するための挿入機能があります
void insert(struct ClientList *newItem,int new_s) {
pthread_mutex_lock(&mymutex);
struct ClientList *temp = (struct ClientList *) malloc(sizeof(struct ClientList)) ;
temp->socket = new_s;
temp->Next = head;
head = temp;
pthread_mutex_unlock(&mymutex);
}//insert function
ここに削除機能があります
int del(struct ClientList *temp,struct ClientList *newItem) {
struct ClientList *cur = head;
if (temp == head) {
head = temp->Next;
free(temp);
return 0;
}//if
else {
while (cur) {
if (cur->Next == temp) {
cur->Next = temp->Next;
free(temp);
}//if
cur = cur->Next;
}//while
}//else
}//del
最初のノードでは問題はありませんが、他のすべてのノードでは機能しません。
クリネットからすべての人にメッセージをブロードキャストするために使用するブロードキャスト機能を追加する必要があります。ここにブロードキャストコードがあります:
void broadcast(struct ClientList* temp,char buf[MAX_LINE],struct ClientList * newItem) {
int len;
pthread_mutex_lock(&mymutex);
for(temp = head; temp != NULL; temp =temp->Next) {
if (temp->socket ! =newItem->socket) {
buf[MAX_LINE-1]= '\0';
len = strlen(buf) + 1;
send(temp->socket, buf, len, 0);
}//if
}//for
pthread_mutex_unlock(&mymutex);
}//broadcast