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);
}