socketプログラム
ソケットプログラムって、設定するパラメータが多くて、どれを選ぶかよくわかんないんだよね。ついでに世の主流がUnixのsoketとWindowsのWinSockの2つがあるから、ますます混乱する。ついでにcygwin上だとどっちの流儀なんだ?というわけだ。
まぁそこは試してみるべ、というわけでとりあえずcygwin上でUnixのソケットを試してみることにした。
まだ全然完成していない。サーバのソケットを作るところまで。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <unistd.h> /* UDP用ソケットを作って返す */ int createSocket(void) { int sock; struct addrinfo tHint = {0}; struct addrinfo *pResult = NULL; struct addrinfo *pTmp = NULL; int ret; /* inet addr取得 */ tHint.ai_family = AF_INET; /* IPv4 */ tHint.ai_socktype = SOCK_DGRAM; /* UDP */ /* IPアドレス情報取得 */ ret = getaddrinfo(NULL, "123456", &tHint, &pResult); if (ret) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); goto ERROR; } /* アドレスリストをたぐってソケットを作成 */ for (pTmp = pResult; pTmp != NULL; pTmp = pTmp->ai_next) { sock = socket(pTmp->ai_family, pTmp->ai_socktype, pTmp->ai_protocol); if (sock == -1) { /* 次のリストでリトライ */ continue; } else if (bind(sock, pTmp->ai_addr, pTmp->ai_addrlen) == 0) { /* bind成功 */ break; } close(sock); } if (pTmp == NULL) { fprintf(stderr, "no address success\n"); goto ERROR; } freeaddrinfo(pResult); /* アドレス情報解放 */ return sock; ERROR: return -1; } int main(int argc, char **argv) { int sock; sock = createSocket(); if (sock == -1) { goto ERROR; } printf("%d\n", sock); close(sock); return 0; ERROR: /* エラー終了 */ exit(EXIT_FAILURE); }