⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 TCP一个简单应用,功能不完善,刚学的, 运用一下刚学的知识
💻 CPP
字号:
#include<Winsock2.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define DEFAULT_PORT 5050
//#define FD_SETSIZ 5;
void main()
{
	WSADATA wsaData;
	SOCKET sListen,sAccept;
	struct sockaddr_in ser,cli;
	int temp = 0;

	WSAStartup(MAKEWORD(2,2),&wsaData);
	cout << "服务器已启动...."<<endl;
	sListen = socket(AF_INET,SOCK_STREAM,0);
	if(sListen==INVALID_SOCKET)
	{
		cout <<"套接字错误!";
	}
	ser.sin_family = AF_INET;
	ser.sin_port=htons(5050);
	ser.sin_addr.s_addr=htonl(INADDR_ANY);
    if(bind(sListen,(SOCKADDR*)&ser,sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		cout <<"绑定错误!";
		return;
	}
	listen(sListen,5);
	SOCKET sockclient[FD_SETSIZE];
	for(int i = 0;i < FD_SETSIZE;i++)   
	{
		sockclient[i] =INVALID_SOCKET; 
	}

	    fd_set   rset,allset;   	
		FD_ZERO(&allset);   	
		FD_SET(sListen, &allset);  	
//		timeval tv;	
//		tv.tv_sec = 5;	
//		tv.tv_usec = 0;


	#define MSG_MAX_SIZE 1024
	char   buf[FD_SETSIZE][MSG_MAX_SIZE];   

	for(;;)  
	{   
		
		rset = allset;   //structure assignment
		int ret = select(0,&rset,NULL,NULL,NULL);
		if (ret == SOCKET_ERROR)  
		{   
			cout << "select()1 failed: "<< WSAGetLastError()<<endl;
			break;
		}   
		if (ret == 0) {
			continue;
		}
		if(FD_ISSET(sListen, &rset)) 
		{   
			struct   sockaddr_in   cliaddr;   
			int clilen   =   sizeof(cliaddr);   
			SOCKET sockConn = accept(sListen,(sockaddr *)&cliaddr, &clilen);
			if (sockConn == SOCKET_ERROR) 
			{
				cout << "accept() failed: "<< WSAGetLastError()<<endl;
				break; //continue
			}   
			for(i = 0; i < FD_SETSIZE; i++)  
			{
				if(sockclient[i] == INVALID_SOCKET) 
				{   
					sockclient[i]   =   sockConn;
					temp = i;
					break;   
				}   
			} //for end
			if(i <= FD_SETSIZE) 
			{   
				FD_SET(sockConn, &allset);   
			}   
			else{
				cout<<"too   many   clients";   
				closesocket(sockConn);
			}

		}
			// if (FD_ISSET(ListenSocket, &rset))  end
        
		for(i = 0; i <= FD_SETSIZE; i++)   
		{   
			if ((sockclient[i] != INVALID_SOCKET) &&
			   FD_ISSET(sockclient[i], &rset))   
			   {   
				memset(buf[i], 0 , MSG_MAX_SIZE);
				int nByte = recv(sockclient[i], buf[i], MSG_MAX_SIZE, 0);
				cout<<"客户端:"<< buf[i]<<"已进入!\n";
				if (nByte == SOCKET_ERROR)
				{
					cout << "接受错误: "<< WSAGetLastError()<<endl;
					FD_CLR(sockclient[i],&allset);   
					closesocket(sockclient[i]);
					sockclient[i] = INVALID_SOCKET;
					continue;
				}
						
				if (nByte == 0)
				{
					FD_CLR(sockclient[i],&allset);   
					closesocket(sockclient[i]);
					sockclient[i] = INVALID_SOCKET;
					continue;
				}
//				send(sockclient[i],buf[i],sizeof(buf[i])+1,0);
				for(int index = 0;index < temp ; index++)
				{
					if((sockclient[i] != INVALID_SOCKET))
					{
     					int unsend = send(sockclient[temp],buf[index],sizeof(buf[index]),0);
	    				if(unsend == SOCKET_ERROR)
		    			{
		    				cout << "发送错误:"<< WSAGetLastError()<<endl;
		    				closesocket(sockclient[i]);
		    			    sockclient[i] = INVALID_SOCKET;
			    		    continue;
			    		}
					}
				}
				for(int index = 0;index < temp ; index++)
				{
					if((sockclient[i] != INVALID_SOCKET))
					{
					  int unsend = send(sockclient[index],buf[temp],sizeof(buf[temp]),0);
					  if(unsend == SOCKET_ERROR)
					  {
						  cout << "发送错误:"<<WSAGetLastError()<<endl;
						  closesocket(sockclient[i]);
					      sockclient[i] = INVALID_SOCKET;
					      continue;
					  }
					}
				}
				//do the request
			   }
		}//loop client end
	}//	for(;;)  end
	closesocket(sListen);
	WSACleanup();
//	system("pause");
//	return 0;
}

	/*int iLen = sizeof(cli);
	char recvbuf[100],sendbuf[100] = "hello!";
	while(1)
	{
		sAccept = accept(sListen,(SOCKADDR*)&cli,&iLen);
		recv(sAccept,recvbuf,sizeof(recvbuf),0);

		cout << recvbuf << endl;
	    send(sAccept,sendbuf,sizeof(sendbuf)+1,0);
		closesocket(sAccept);
		
	}*/
	//WSACleanup();
//}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -