WinSock2を使用したTCP接続
WinSock2を使用したTCP接続による、データ受け渡しの例を紹介します。
------------- クライアント側のコード ----------------
// TCP接続を確率する
int CTcpClientSock::tcp_connect(char* IP_Address)
{
WSADATA wsaData;
struct sockaddr_in server;
// winsock2の初期化
WSAStartup(MAKEWORD(2,0), &wsaData);
// ソケットの作成
sock = socket(AF_INET, SOCK_STREAM, 0);
// 接続先指定用構造体の準備
server.sin_family = AF_INET;
server.sin_port = htons(56789);
server.sin_addr.S_un.S_addr = inet_addr(IP_Address);
// サーバに接続
connect(sock, (struct sockaddr *)&server, sizeof(server));
return 0;
}
// サーバからデータを受信
int CTcpClientSock::recive()
{
memset(RevData, 0, sizeof(RevData));
int n = recv(sock, RevData, sizeof(RevData), 0);
return n;
}
// TCP接続を切断する
int CTcpClientSock::tcp_disconnect(void)
{
WSACleanup();
return 0;
}
------------- サーバ側のコード ----------------
#include "Windows.h"
#include
CRITICAL_SECTION g_critical_section;
SOCKET sock0;
SOCKET sock;
// WinSockをTCPで起動する
//[戻り値]正常 = 1、失敗 = -1
int CTcpSvSock::StartSvSock(void)
{
WSADATA wsaData;
struct sockaddr_in addr;
if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
return -1;
}
sock0 = socket(AF_INET, SOCK_STREAM, 0);
if (sock0 == INVALID_SOCKET) {
return -1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(56789);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
return -1;
}
if (listen(sock0, 5) != 0) {
return -1;
}
return 1;
}
// Clientへデータを送信する
void SendToClient(char* SendData)
{
struct sockaddr_in client;
int SendDataLen, len, n;
SendDataLen = strlen(SendData);
//Clientが切断するまで、データを送る
while(1){
//クリティカルセクションに入る
EnterCriticalSection(&g_critical_section);
//クライアントからの接続を待つ
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
if (sock == INVALID_SOCKET) {
AfxMessageBox("クライアントとの接続に失敗しました");
break;
}
//クライアントへデータを送る
n = send(sock, SendData, SendDataLen, 0);
if (n < 1) {
AfxMessageBox("クライアントへのデータ送信に失敗しました");
break;
}
closesocket(sock);
//クリティカルセクション
LeaveCriticalSection(&g_critical_section);
}
//Threadを終了
ExitThread(0);
}
// WinSockを終了する
void CTcpSvSock::EndSvSock(void)
{
//クリティカルセクションを終了
DeleteCriticalSection(&g_critical_section);
WSACleanup();
}
//クライアントからの接続受けのスレッド開始
void CTcpSvSock::SvStartThread(void)
{
HANDLE hThread;
DWORD threadID;
char *SendData = new char[m_SendStrSv2Cl.GetLength()];
strcpy(SendData, m_SendStrSv2Cl);
//クリティカルセクションを初期化する
InitializeCriticalSection(&g_critical_section);
//スレッドの開始
hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SendToClient,
(void*)SendData, 0, &threadID);
}
[サンプル・ソース(クライアント側)]
[サンプル・ソース(サーバー側)]
(注意)このサンプルは、Visual C++ 2003.Net で作成されています。