開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 sock_s
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

sock_s.c
// インポート ライブラリ
#pragma comment(lib, "ws2_32.lib")
 
#include <stdio.h>
#include <WinSock2.h>
 
int main(int argc, char* argv[])
{
	WSADATA		wsaData;
	SOCKET		sock;
	SOCKET		sockNew;
	SOCKADDR_IN	name;
	char		acBuf[16];
	int		iPort;
	int		iAddrLen;
	int		iRet;
 
	if (argc != 2) {
		fprintf(stderr, "usage: sock_s port\n");
		return 1;
	}
	iPort = atoi(argv[1]);
 
	// WinSockDLLの初期化
	iRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iRet != 0) {
		fprintf(stderr, "error: WSAStartup:%d\n", iRet);
		return 1;
	}
 
	// TCPソケット記述子の作成
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == INVALID_SOCKET) {
		fprintf(stderr, "error: socket\n");
		return 1;
	}
 
	// ポート番号を割り当てる
	name.sin_family		= AF_INET;
	name.sin_port		= htons(iPort);
	name.sin_addr.s_addr	= INADDR_ANY;
	iRet = bind(sock, (SOCKADDR*)&name, sizeof name);
	if (iRet != 0) {
		fprintf(stderr, "error: bind\n");
		return 1;
	}
 
	// 接続要求キューの用意
	iRet = listen(sock, 1);
	if (iRet != 0) {
		fprintf(stderr, "error: listen\n");
		return 1;
	}
 
	// クライアントからの接続待ち
	iAddrLen = sizeof name;
	sockNew = accept(sock, (SOCKADDR*)&name, &iAddrLen);
	if (sockNew == INVALID_SOCKET) {
		fprintf(stderr, "error: accept\n");
		return 1;
	}
 
	while (1) {
		memset(acBuf, '\0', _countof(acBuf));
		iRet = recv(sockNew, acBuf, _countof(acBuf), 0);
		if (iRet == SOCKET_ERROR) {
			fprintf(stderr, "error: recv\n");
			return 1;
		}
		printf("%d:%.16s\n", iRet, acBuf);
		if (iRet == 0) {
			printf("接続が切れました。\n");
			break;
		}
		if (strcmp(acBuf, "exit") == 0) {
			break;
		}
	}
 
	shutdown(sockNew, SD_BOTH);
	closesocket(sockNew);
	closesocket(sock);
	WSACleanup();
	return 0;
}
 

出力
C:\>sock_s 2222
5:hello
4:exit
最終更新:2012年09月01日 16:50