アットウィキロゴ

Socketプログラム2

#pragma comment(lib, "wsock32.lib") // wsock32.libにリンクをはる
#define PORT 8000
 
//__stdcallってなんぞ? => WINAPIのエイリアス。WINAPI関数に準じた呼び出し規約でスタックメモリを使いますということ(?)
unsigned int __stdcall send_func(LPVOID lpsocksend);
void recv_func(SOCKET sockrecv);
 
//DNSにたずねることで、ホスト名からIPアドレスに変換する
void hostname2ip(const char* host_name);
 
int main (){
 
	WSADATA wsaData;
	struct sockaddr_in server;
	SOCKET sockrecv, socksend;
	HANDLE hthread;
	unsigned int threadId;
	unsigned long val=0;
	fd_set fds;
 
	// .dllとしてパックされているwinsock2の初期化
	if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0){	//返り値0なら成功
		fprintf(stderr, "startup");
		return 0;
	}
 
	hostname2ip("www.google.co.jp");
 
	// ソケットの作成
	sockrecv = socket(AF_INET, SOCK_STREAM, 0);
	socksend = socket(AF_INET, SOCK_STREAM, 0);
	if((sockrecv == INVALID_SOCKET) || (socksend == INVALID_SOCKET)){
		fprintf(stderr, "socket");
		return 0;
	}
	printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
		(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
		wsaData.szDescription ,	wsaData.szSystemStatus
	);
 
	// 接続先指定用構造体の準備
	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr.S_un.S_addr = inet_addr("192.168.24.51");
	ioctlsocket(sockrecv, FIONBIO, &val);
	ioctlsocket(socksend, FIONBIO, &val);
 
	//ポートが使えるか確認
	if(connect(sockrecv, (struct sockaddr *)&server, sizeof(server)) != 0){
		fprintf(stderr, "recv port");
		return 0;
	}
	if(connect(socksend, (struct sockaddr *)&server, sizeof(server)) != 0){
		fprintf(stderr, "send port");
		return 0;
	}
 
	//hthread = (HANDLE)_beginthreadex(NULL, 0, send_func, (LPVOID)socksend, 0, &threadId);
 
	//recv_func(sockrecv);
 
	WaitForSingleObject(hthread, INFINITE);
	closesocket(sockrecv);
	closesocket(socksend);
	WSACleanup();
 
	return 0;
}
 
void hostname2ip(const char* host_name){
 
	int iCount;
 
	LPHOSTENT host = gethostbyname(host_name);
	if (host == NULL) {
		fprintf(stderr , "ホスト名の取得に失敗しました : %s" , host_name);
		return ;
	}
 
	printf("公式名 = %s\n" , host->h_name);
	for(iCount = 0 ; host->h_aliases[iCount] ; iCount++) {
		printf("別名 = %s\n" , host->h_aliases[iCount]);
	}
 
	for(iCount = 0 ; host->h_addr_list[iCount] ; iCount++) {
		printf("IP = %d.%d.%d.%d\n" ,
			(BYTE)*((host->h_addr_list[iCount])) ,
			(BYTE)*((host->h_addr_list[iCount]) + 1) ,
			(BYTE)*((host->h_addr_list[iCount]) + 2) ,
			(BYTE)*((host->h_addr_list[iCount]) + 3)
		);
	}
 
}

タグ:

C言語
最終更新:2011年07月17日 14:16