C++単純Socketサービス側コード実装

4661 ワード

原文アドレス:クリックしてリンクを開く
コードは次のとおりです.
// Server.cpp :              。
//

#include "stdafx.h"
#include 
#pragma comment(lib,"Ws2_32.lib")


int _tmain(int argc, _TCHAR* argv[])
{
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
	{
		printf("load socket version error!
"); return 0; } SOCKET sockListen = socket(AF_INET,SOCK_STREAM,0); if (sockListen == INVALID_SOCKET) { printf("create socket error!
"); return 0; } sockaddr_in srvAddr; srvAddr.sin_family = AF_INET; srvAddr.sin_port = htons(80); srvAddr.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(sockListen,(sockaddr*)&srvAddr,sizeof(srvAddr)) == INVALID_SOCKET) { printf("bind error
"); return 0; } if(listen(sockListen,10) == INVALID_SOCKET) { printf("listen error!
"); return 0; } SOCKET sockMsg; sockaddr_in remoteAddr; int nLen = sizeof(remoteAddr); sockMsg = accept(sockListen,(sockaddr *)&remoteAddr,&nLen); if (sockMsg == INVALID_SOCKET) { printf("accept error!
"); return 0; } char recvBuf[255]; memset(recvBuf,1,sizeof(recvBuf)); while (true) { recv(sockMsg,recvBuf,sizeof(recvBuf),0); printf("%s
",recvBuf); const char* sendBuf = "hello Client!"; send(sockMsg,sendBuf,strlen(sendBuf),0); } closesocket(sockMsg); closesocket(sockListen); WSACleanup(); return 0; }

分割の説明:
        WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
	{
		printf("load socket version error!
"); return 0; }

ソケットバージョンライブラリをロードします.
WSADADATA:WSAstartup関数呼び出し後に返されるWindows Socketsデータを格納します.
WSAstartup関数:WSAの有効化コマンド;
WSA:Windows Socket Asynchronous Windows非同期ソケット
SOCKET sockListen = socket(AF_INET,SOCK_STREAM,0);
	if (sockListen == INVALID_SOCKET)
	{
		printf("create socket error!
"); return 0; }

ソケットを作成します.
SOCKET socket(int af, int type, int protocol);
int af:アドレスファミリーを指定する;
int type:socketタイプ、常用SOCKET_を指定STREAM,SOCK_DGRAM;
int protocol:プロトコルを指定し、0の場合、2番目のパラメータに一致するプロトコルを自動的に選択し、一般的にデフォルトは0です.
sockaddr_in srvAddr;
	srvAddr.sin_family = AF_INET;
	srvAddr.sin_port = htons(80);
	srvAddr.sin_addr.S_un.S_addr = INADDR_ANY;

	if (bind(sockListen,(sockaddr*)&srvAddr,sizeof(srvAddr)) == INVALID_SOCKET)
	{
		printf("bind error
"); return 0; }

IPとポートをバインドします.
int bind(SOCKET s, const struct sockaddr FAR* name, int namelen);
SOCKET s:バインドされていないソケットを記述する記述子、すなわち、バインドを繰り返してはならない.
const struct sockaddr FAR*name:sockaddr構造からソケットが割り当てられたアドレス;
int namelen:nameパラメータの値の長さ;
srvAddr.sin_family = AF_INET:ソケットを作成する場合、このフィールドでアドレスファミリーを指定します.TCP/IPプロトコルについては、AF_に設定する必要があります.INET ;
srvAddr.sin_port = htons(80): sin_portポート番号を設定する;
srvAddr.sin_addr.S_un.S_addr = INADDR_ANY:IP設定
if(listen(sockListen,10) == INVALID_SOCKET)
	{
		printf("listen error!
"); return 0; }

リスニングを開始します.
int listen(SOCKET s, int blacklog);
SOCKET s:バインドされた接続されていないソケットを記述する記述子.
int blacklog:接続待ちキューの最大長;
  SOCKET sockMsg;
	sockaddr_in remoteAddr;
	int nLen = sizeof(remoteAddr);

	sockMsg = accept(sockListen,(sockaddr *)&remoteAddr,&nLen);
	if (sockMsg == INVALID_SOCKET)
	{
		printf("accept error!
"); return 0; }

データ受信.
SOCKET sockMsg:通信ソケット;
sockaddr_in remoteAddr:リモート接続アドレス;
SOCKET accept(_in SOCKET s, _out struct sockaddr* addr, _inout int *addrlen);
in SOCKET s:リスニング関数でリスニング状態に置かれたソケットを記述する記述子;
_out struct sockaddr*addr:接続エンティティのアドレスを受信するためのオプションのポインタ.
_inout int*addrlen:addrパラメータが指す構造の長さを含む整数を指す任意のポインタ.
  char recvBuf[255];
	memset(recvBuf,1,sizeof(recvBuf));
	while (true)
	{
		recv(sockMsg,recvBuf,sizeof(recvBuf),0);
		printf("%s
",recvBuf); const char* sendBuf = "hello Client!"; send(sockMsg,sendBuf,strlen(sendBuf),0); }

データの受信と送信.
memset():この関数は、新規申請のメモリの初期化を行います.
int recv(SOCKET s, char FAR *buf, int len, int flags); 受信バイト数を返します
SOCKET s:接続ソケット記述子;
char FAR*buf:データ入力用バッファ;
int len:bufパラメータの長さ;
int flags:タグは呼び出しの方式を指定し、一般的に0である.
int send(SOCKET s, char FAR *buf, int len, int flags);エラーが発生しない場合、関数は送信されたバイト数を返します.
SOCKET s:接続ソケット記述子;
char FAR*buf:転送するデータを含むバッファ;
int len:bufパラメータの長さ;
int flags:タグは呼び出しの方式を指定し、一般的に0である.
        closesocket(sockMsg);
	closesocket(sockListen);
	WSACleanup();

リソースを解放します.