前提
C言語でUDP通信を使ったチャットプログラムを製作中、クライアント側からのチャット参加要求の処理に困っています。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 線形連結リストを使って、クライアント用のクライアント管理データを作成し、データ集合内に保持する。(可能であれば削除まで)
該当のソースコード
C
1 2//サーバー側のプログラム 3 4#include <stdio.h> 5#include <string.h> 6#include <arpa/inet.h> 7#include <stdlib.h> 8#include <unistd.h> 9#include <time.h> 10 11#include "MessagePacket.h" 12 13// 静的グローバル変数 14static int g_sock; // チャットクライアントと通信するために利用するソケット 15 16// 構造体の宣言 17struct ClientData { 18 char srcAddr[INET_ADDRSTRLEN]; // クライアントのアドレス 19 u_short srcPort; // クライアントのポート番号 20 char participantName[MSG_BUF_SIZE]; // 参加者名 21 time_t lastReceivingTime; // メッセージを最後に受信した時刻 22}; 23 24struct Node { 25// struct ClientData client; 26// struct Node* next; 27//}; 28 29// 静的グローバル変数 30static struct Node* g_root; 31 32void SvrInitialize( 33 int sock) // [IN] チャットクライアントと通信するためのソケット 34{ 35 // チャットクライアントと通信するためのソケットをこのファイル内で保持する. 36 g_sock = sock; 37 38int SvrJoinRequestHandler( 39 struct sockaddr_in clntAddr, // [IN ] クライアントのアドレス構造体 40 char* msgBuf, // [IN ] メッセージバッファ 41 short msgLen) // [IN ] メッセージの長さ 42{ 43 int result = 1; // 戻り値 44 45 // 送信元のIPアドレスとポート番号を取得する. 46 char srcAddr[INET_ADDRSTRLEN]; 47 inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, srcAddr, INET_ADDRSTRLEN); 48 u_short srcPort = ntohs(clntAddr.sin_port); 49 50 // クライアントの参加者名として受信した文字列を終端し,表示する. 51 msgBuf[msgLen] = '\0'; 52 printf("クライアント(IPアドレス:%s, ポート番号:%d)からの参加要求:%s\n", srcAddr, srcPort, msgBuf); 53 54 // クライアントからの参加要求を処理する. 55 // ※参加要求を送ってきたクライアント用のクライアント管理データを作成し, 56 // データ集合内に保持する必要がある. 57 //未実装 58 59 // グループへの参加応答を送信する. 60 short sentByte = SendMessagePacket( 61 g_sock, // クライアントとの通信用ソケット 62 clntAddr, // クライアントのアドレス (参加要求送信元のアドレス) 63 MSG_JOIN_RESPONSE, // グループへの参加応答のメッセージID 64 msgBuf, // クライアントの参加者名 65 msgLen // クライアントの参加者名の長さ 66 ); 67 if (sentByte < 0) { 68 fprintf(stderr, "error: SvrJoinRequestHandler() -> SendMessagePacket(): %d\n", sentByte); 69 } 70 // 送信バイト数(エラーの場合を含む)を戻り値として返す. 71 result = sentByte; 72 return result; 73}
試したこと
ノード構造体の記述までは行うことができました(コード13~27)が、そもそも線形連結リストに慣れていないもので、UDP通信においてのリストの生成や追加については徹夜で調べても分かりませんでした。ヒントでもいいので現状打破のきっかけが欲しいです。

回答2件
あなたの回答
tips
プレビュー