Net004

Windows版単純な server program

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

int main(int argc, char* argv[])
{
	struct sockaddr_in saddr;
	struct sockaddr_in caddr;
	socklen_t calen;

	SOCKET sd;
	SOCKET cd;
	int port;
	int err;

	WORD wReqVersion;
	WSADATA wsa;

	/* Check the command-line arguments */
	if(argc != 2)
	{
		fprintf(stderr, "Usage: %s port\n", argv[0]);
		return (-1);
	}
	
	port = atoi(argv[1]);
	if(port <= 0)
	{
		fprintf(stderr, "Illegal port number (%d)\n", port);
		return (-1);
	}

	/* Start the WinSock library */
	wReqVersion = MAKEWORD(2,2);
	if((err = WSAStartup(wReqVersion, &wsa)) != 0)
		return err;
	if((LOBYTE(wsa.wVersion) != 2) ||
	   (HIBYTE(wsa.wVersion) != 2))
	{
		WSACleanup();
		return (-1);
	}

	/* Set the server address */
	memset(&saddr, 0, sizeof(saddr));
	memset(&caddr, 0, sizeof(caddr));

	saddr.sin_family = AF_INET;
	saddr.sin_port = htons((u_short)port);
	saddr.sin_addr.s_addr = INADDR_ANY;
	
	/* Create socket for listen port and bind the server address */
	if((sd = socket( PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{
		err = WSAGetLastError();
		WSACleanup();
		return err;
	}
	if(bind(sd, (const struct sockaddr*)&saddr, sizeof(saddr)) == SOCKET_ERROR)
	{
		err = WSAGetLastError();
		closesocket(sd);
		WSACleanup();
		return err;
	}

	/* Listen the service port */
	if(listen(sd, 5) == SOCKET_ERROR)
	{
		err = WSAGetLastError();
		closesocket(sd);
		WSACleanup();
		return err;
	}

	while(1)
	{
		/* Clear the address for accept */
		memset(&caddr, 0, sizeof(caddr));
		calen = sizeof(caddr);
		/* Dequeue the requested connection in the listen socket */
		if((cd = accept(sd,(struct sockaddr*)&caddr, &calen)) == SOCKET_ERROR)
		{
			err = WSAGetLastError();
			closesocket(sd);
			WSACleanup();
			return err;
		}
		send(cd, "Hello\r\n", 7, 0);
		closesocket(cd);
	}

	/* Server done. (Never come) */
	closesocket(sd);
	WSACleanup();
	return 0;
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-09 (木) 10:38:32 (82d)