Skip to content

エコーサーバー・クライアントの実装(いただいたコメントの対応)#3

Open
thonda28 wants to merge 17 commits intomainfrom
feature/improvements
Open

エコーサーバー・クライアントの実装(いただいたコメントの対応)#3
thonda28 wants to merge 17 commits intomainfrom
feature/improvements

Conversation

@thonda28
Copy link
Copy Markdown
Owner

@thonda28 thonda28 commented Feb 5, 2025

Description

#2 の続き(#2 に続けると煩雑になると判断したため、PR を分離)

2025/01/27 に小西さんにいただいたコメント(このコメント以降のもの)に対する対応を行う(詳細は以下に記入)

  • SocketManager まわりの修正
    • メモリ確保を new_socket_manager() に、メモリ解放を free_socket_manager() に修正
    • find_socket() は O(N) かかるため、epoll_event->data->ptrSocketData のポインタをもたせることで性能改善
  • SocketData まわりの修正
    • SocketType を設定し、Type を見て処理を分岐
      • 元々 SocketDatafind_socket(client_socket_manager, events[i].data.fd) のように取得したためどんなソケットかが判断できたが、ポインタから直接辿れるようになると listen_socket なのか client_socket かの判断がつかなくなったため
      • PIPE もまとめて Socket という扱いに入れている部分は微妙なので命名あたりを修正したほうがよさそう
    • SocketDatabuffer_startbuffer_end を追加し、それらを使って recv()/send() 時のバッファを管理
  • SIGINT がきたときの安全な終了
    • listen_socket_managerclient_socket_manager を解放してから breakepoll_wait() がブロックしないようにタイムアウトも設定)
    • socket_manager が解放されていなくても一定時間経過後に break
  • その他比較的小さめな修正
    • Makefile で $@$^ という特殊変数を使用
    • エラー時の puts()fputs() を使って標準エラー出力へ出力
      • puts() は改行あり、fputs() は改行なしという差分に気づいたので、そのあたりも整理
    • int 型にもかかわらず is_xxx となっていた変数名を修正
    • ほぼ同じコードの共通化
    • ひとまとまりの処理を関数化して分離
    • SIGPIPE の対応をしなくてよいように MSG_NOSIGNAL フラグを send() に設定
    • などなど

コミットを細かめに分けたので、コミット単位で見ていただくのがわかりやすいかもです。

Note

3点わかっていない点があり、それは #2コメント に返信(以下詳細)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant