WinSockとバークレーソケット

  • UNIXバークレーソケットはint型、WinsockのソケットはSOCKET型(実態は整数型)。
  • UNIXではソケットはファイルディスクリプタと同様に扱えるためread⁄write&closeを使用出来るが、Winsockはrecv⁄send&closesocketを使用する。
  • エラー定数が異なる。

両プラットフォームで使えるようにする対応策としては

#ifdef WIN32
#include<windows.h>
#include<winsock.h>
#define perror(_Z) fprintf(stderr, "%s error\n", _Z)
#define herror(_Z) fprintf(stderr, "%s error\n", _Z)
#define exit(_Z) WSACleanup();exit(_Z)
#define close(_Z) closesocket(_Z)
#else
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa.h>
#include<netdb.h>
#endif
~~
(関数内で)
#ifdef WIN32
WSADATA wsaData;
if(WSAStartup0x0101, &wsaData) != 0) {
 fprintf(stderr, "Winsock error\n");
 exit(1);
}
#endif
~~
socket---bind---listen---accept---resv/send---close(server)
       |
       -----------------connect---resv/send---close(client)

参考:村山公保『基礎からわかるTCP/IP ネットワークコンピューティング入門』