開発環境 |
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