トップへ

  検索 辞書 交通 地図 天気

TCP/IPネットワークプログラミング
Windows Visual C++ でTCP/IPネットワークを使うサンプルプログラムです. 「プロジェクト」→「ライブラリ」→「リンク」にあるオブジェクト/ライブラリ モジュールに ws2_32.lib を付け加えてからコンパイルして下さい. サーバープログラムとクライアントプログラムの2つを用意しています. サーバープログラムを実行してから,クライアントプログラムを実行して下さい. linux gcc 版 を探している方はこちらへどうぞ. linux のクライアントから Windows のサーバーにつなぐことも可能です.

//Windows VC++ での TCP/IP サンプルプログラム(ここからサーバー)
//クライアントから送られてきた文字列を大文字に変換して送り返す
//サーバープログラムを実行してからクライアントプログラムを実行して下さい

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

#define PORT 9876 //クライアントプログラムとポート番号を合わせてください

int main() {
	int i;
	// ポート番号,ソケット
	int srcSocket;  // 自分
	int dstSocket;  // 相手

	// sockaddr_in 構造体
	struct sockaddr_in srcAddr;
	struct sockaddr_in dstAddr;
	int dstAddrSize = sizeof(dstAddr);
	int status;
	// 各種パラメータ
	int numrcv;
	char buffer[1024];

	// Windows の場合
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);
	// sockaddr_in 構造体のセット
	memset(&srcAddr, 0, sizeof(srcAddr));
	srcAddr.sin_port = htons(PORT);
	srcAddr.sin_family = AF_INET;
	srcAddr.sin_addr.s_addr = htonl(INADDR_ANY);

	// ソケットの生成(ストリーム型)
	srcSocket = socket(AF_INET, SOCK_STREAM, 0);
  	// ソケットのバインド
	bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));
  	// 接続の許可
	listen(srcSocket, 1);

 	while(1){ //ループで回すことによって何度でもクライアントからつなぐことができる

		// 接続の受付け
		printf("接続を待っています\nクライアントプログラムを動かしてください\n");
		dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize);
		printf("%s から接続を受けました\n", inet_ntoa(dstAddr.sin_addr));

		while(1){
			//パケットの受信
			numrcv = recv(dstSocket, buffer, sizeof(char)*1024, 0);
			if(numrcv ==0 || numrcv ==-1 ){
				status = closesocket(dstSocket); break;
			}
			printf("変換前 %s",buffer);
			for (i=0; i< numrcv; i++){ // bufの中の小文字を大文字に変換
				//if(isalpha(buffer[i])) 
					buffer[i] = toupper(buffer[i]);
			}
			// パケットの送信
			send(dstSocket, buffer, sizeof(char)*1024, 0);
			printf("→ 変換後 %s \n",buffer);
		}
	}
	// Windows での終了設定
	WSACleanup();

	return(0);
}

////////////////////////////////////////////////////////////////////////////////////////
//Windows VC++ での TCP/IP サンプルプログラム(ここからはクライアント)
//入力されたデータをクライアントに送り,もらったデータを表示する
//サーバープログラムを実行してからクライアントプログラムを実行して下さい

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

#define PORT 9876 //サーバープログラムとポート番号を合わせてください

int main() {
	// IP アドレス,ポート番号,ソケット,sockaddr_in 構造体
	char destination[32];
	int dstSocket;
	struct sockaddr_in dstAddr;

	// 各種パラメータ
	char buffer[1024];

	// Windows の場合
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);

	// 相手先アドレスの入力と送る文字の入力
	printf("サーバーマシンのIPは?:");
	scanf("%s", destination);

	// sockaddr_in 構造体のセット
	memset(&dstAddr, 0, sizeof(dstAddr));
	dstAddr.sin_port = htons(PORT);
	dstAddr.sin_family = AF_INET;
	dstAddr.sin_addr.s_addr = inet_addr(destination);

	// ソケットの生成
	dstSocket = socket(AF_INET, SOCK_STREAM, 0);

	//接続
	if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
		printf("%s に接続できませんでした\n",destination);
		return(-1);
	}
  	printf("%s に接続しました\n", destination);
  	printf("適当なアルファベットを入力してください\n");

	while (1){
		scanf("%s",buffer);
		//パケットの送信
		send(dstSocket, buffer, 1024, 0);
		//パケットの受信
		recv(dstSocket, buffer, 1024, 0);
		printf("→ %s\n\n",buffer);
	}

	// Windows でのソケットの終了
	closesocket(dstSocket);
	WSACleanup();
	return(0);
}

トップへ他のサンプルプログラムへ

月に2回程度の更新を目標としています

Copyright(c) Masaki Onishi All rights reserved.