いろんなものはつながっている

ネットワークプログラミング基礎 TCP接続

クライアントとサーバ間の同期通信の手順はほぼワンパターンでここににわかりやすくかいてある。WinSockを使った手順をざっと書いてみる。
TCP1
ワンパターンのプログラムが以下。ほぼ同じコードがここに紹介されている。以下のプログラムはクライアントからサーバへ文字列を送るというもの。

acceptの第三引数にはstruct sockaddrのサイズを格納した変数のポインタをわたさないといけないが、単にintのポインタを渡していたためおおはまりした。

int nConnectedSocket = accept(nSrcSocket, (struct sockaddr*)&ClientAddr, &nClientAddrSize);

サーバ側のプログラム

// TCP接続(同期型)プログラム サーバ側

#include "stdafx.h"

#pragma comment(lib, "ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>

#define PORT 9876	// 使用するポート番号

#define BUFFER_SIZE 1024

int _tmain(int argc, _TCHAR* argv[])
{
	// WinSockの初期化
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);

	// ソケットの生成(TCP用)
	int nSrcSocket = socket(AF_INET, SOCK_STREAM, 0);	

	// IP,ポート番号の設定
	// sockaddr_in 構造体
	struct sockaddr_in ServerAddr;
	memset(&ServerAddr, 0, sizeof(ServerAddr));
	ServerAddr.sin_port = htons(PORT);
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);//どのIPアドレスからでも接続を受け付ける

	bind(nSrcSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));

  	// コネクションの受付を開始
	listen(nSrcSocket, 1);
	
	// コネクションを受け付ける
	struct sockaddr_in ClientAddr;
	int nClientAddrSize = sizeof(ClientAddr);
	int nConnectedSocket = accept(nSrcSocket, (struct sockaddr*)&ClientAddr, &nClientAddrSize);
	_tprintf(_T("%s から接続を受けました\n"), inet_ntoa(ClientAddr.sin_addr));

	// メッセージの送受信
	TCHAR szBuffer[BUFFER_SIZE];
	while(1){
		//パケットの受信
		int nSize = recv(nConnectedSocket, szBuffer, BUFFER_SIZE - 1, 0);
		_tprintf(_T("%s"), szBuffer);
		if(_tcscmp(szBuffer, _T("c_end")) == 0){
			break;
		}
	}

	closesocket(nSrcSocket);
	closesocket(nConnectedSocket);
	WSACleanup();

	return 0;

}

クライント側のプログラム

// TCP接続(同期型)プログラム クライアント側

#include "stdafx.h"

#pragma comment(lib, "ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>

#define PORT 9876	// 使用するポート番号

#define BUFFER_SIZE 1024

int _tmain(int argc, _TCHAR* argv[])
{
	// WinSockの初期化
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);

	// ソケットの生成(TCP用)
	int nClientSocket = socket(AF_INET, SOCK_STREAM, 0);	

	// IP,ポート番号の設定
	// sockaddr_in 構造体
	struct sockaddr_in ServerAddr;
	memset(&ServerAddr, 0, sizeof(ServerAddr));
	ServerAddr.sin_port = htons(PORT);
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.s_addr = inet_addr(_T("192.168.11.6"));

  	// コネクションを確立
	if(connect(nClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr))){
		_tprintf(_T("接続できませんでした\n"));
		return(-1);
	}

	// メッセージの送信
 	printf("メッセージを入力してください\n");
	TCHAR szBuffer[BUFFER_SIZE];
	while (1){
		memset(szBuffer, _T('\0'), sizeof(szBuffer));
		_tscanf("%s", szBuffer);
		//パケットの送信
		memset(&szBuffer, _T('\0'), sizeof(szBuffer));
		send(nClientSocket, szBuffer, BUFFER_SIZE, 0);
		_tprintf(_T("%s"), szBuffer);
	}
	
	closesocket(nClientSocket);
	WSACleanup();

	return 0;

}

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク