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