C++学習-Socket入門実験

3219 ワード

Serverエンドコード:

#include <winsock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
#include <vector>
#define SIZE_BUFFER 200
int main(){
	WSAData wsadata;
	WSAStartup(MAKEWORD(2,0),&wsadata);
	SOCKET ssocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//    TCP Socket,      
	struct sockaddr_in server;
	server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	server.sin_family = AF_INET;
	server.sin_port = htons(25000);//        ,        
	 
	if(bind(ssocket,(sockaddr*)&server,sizeof(sockaddr_in)) == SOCKET_ERROR){
		std::cout<<"error bind"<<std::endl;
	}//  TCP Socket        
	if(listen(ssocket, 4) == SOCKET_ERROR){
		std::cout<<"listen error"<<std::endl;
	}

	fd_set read_fdset;//      
	std::vector<int> sockets;//      ,        ,        ,         
	
	while(true){
		FD_ZERO(&read_fdset);
		FD_SET(ssocket,&read_fdset);
		int n = select(0,&read_fdset,NULL,NULL,0);
		if(FD_ISSET(ssocket,&read_fdset)){//              ,             
			SOCKET s = accept(ssocket,NULL,0);//        
			if(n!=SOCKET_ERROR){
				sockets.push_back(s);
				FD_SET(s,&read_fdset);//        FD_READ 
			}
		}

		for(int i=0;i<sockets.size();i++){//                 
			char buffer[SIZE_BUFFER];
			memset(buffer,0,SIZE_BUFFER);
			int len = 0;
			if((len = recv(sockets[i],buffer,SIZE_BUFFER,0))>0){
				printf("recv size = %d, and msg = %s
",len,buffer); }//len:0 , , else if(len == 0){// , sockets.erase(sockets.begin()+i); } } } system("pause"); WSACleanup(); return 0; }

Clientエンドコード:

#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
int main(){
	WSADATA wdata;
	WSAStartup(MAKEWORD(2,0),&wdata);
	SOCKADDR_IN addr;
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addr.sin_family = AF_INET;
	addr.sin_port = htons(25000);
	SOCKET cons = socket(AF_INET,SOCK_STREAM,0);
	//bind(cons,(sockaddr*)&addr,0);
	
	SOCKET s = connect(cons,(sockaddr*)&addr,sizeof(SOCKADDR_IN));
	if( s == SOCKET_ERROR ){
		std::cout<< s << std::endl;
	}
	fd_set readset,writeset,exceptset;
	FD_ZERO(&writeset);
	FD_SET(s,&writeset);
	while(true){
		select(0,&readset,&writeset,&exceptset,0);
		if(FD_ISSET(s,&writeset)){
			
			int size = send(cons,"hello",6,0);
			std::cout<<"send msg size = "<<size<<std::endl;
			closesocket(s);
			WSACleanup();
			break;
		}
	}
	system("pause");
	WSACleanup();
	return 0;
}