Sock-02.Socketとは!
今回のお題
まず、Socket( ソケット )ってなによ?…って話
Socketとは
BSD系UNIXで開発された通信用の仕組み
ネットワーク関係は基本UNIX系
WinSock
Windowsで使用されるSocket API
BSD Socketと互換あり
Socketという仕組みを使用してさえいれば、通信可能
OSを問わない
Windows ⇔ Linux
Windows ⇔ Mac OS
Android ⇔ iOS
開発言語も問わない
C++で開発したアプリケーション ⇔ Javaで開発したアプリケーション
C++で開発したアプリケーション ⇔ Unityで開発したアプリケーション
TCP/IPの通信
階層化されている
table:TCP/IP4階層モデル
アプリケーション層 通信アプリケーション
トランスポート層 OS
インターネット層 OS
ネットワークインタフェース層 NIC・ドライバ
通信アプリケーションが行うことは通信用のデータを作って、トランスポート層に渡すこと
SocketはアプリケーションとOSとの間でデータのやり取りを行うためのポストみたいなイメージ
Socketにデータを入れるとなんか知らんけど相手に届く
なんか知らんけどどっかから届いたデータがSocketに入ってるので、取り出してアプリケーションで利用
「なんかしらんけど」の部分はほかの階層で実装されてるプログラムががんばってくれてる
https://scrapbox.io/files/68e8461869a979e0480f0cbd.png
BSD SocketとWinSock
ほぼほぼ互換
一部データ型・関数などが異なるので注意が必要
例) ソケットディスクリプタ( ソケットを管理するための識別子 ) 用のデータ型
BSD Socket : int
WinSock : SOCKET
typedef UINT_PTR SOCKET;
例) ソケットアドレス用構造体
BSD Socket : sockaddr構造体、sockaddr_in構造体
WinSock : SOCKADDR構造体、SOCKADDR_IN構造体
typedef struct sockaddr SOCKADDR;
例) ソケットの破棄用関数
BSD Socket : close()
WinSock : closesocket()
例) 初期化と終了処理
BSD Socket : 不要
WinSock : WSAStartup()、WSACleanup()
サーバはBSD Socket利用、クライアントはWinSock利用などを考えると、WinSockならではのデータ型などはあまり使用したくない…できれば同じコードを使いまわしたいという気持ち!
というか、WinSockは全般的にだるい...
code:winsock.hの抜粋
#include <windows.h> // windows.h読み込んでいるため多重定義多発
typedef UINT_PTR SOCKET; // これはわかる!環境に合わせたサイズ感は大事!
#define INVALID_SOCKET (SOCKET)(~0) // だるい
#define SOCKET_ERROR (-1) // すごくだるい UINT_PTRに使うくせに-1なのがさらにだるい
ここにVisualStudioのメモリ使う関係の処理のsecureシリーズつかえもあいまって発狂しそうになる
scanfとか使うとscanf_sとか使えってやつ
おまけ
WinSock2.h
winsock.h
#ネットワーク関係
#ネットワークプログラミング