在网上搜集的,如图unix网络编程的unp.h似的:
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32")
using namespace std;
# define REQUEST_BACKLOG 5
bool InitWSA( const WORD &wVersion, WSADATA *wsadata )
{
int Ret = 0;
if ( ( Ret = WSAStartup( wVersion,wsadata ) ) != 0 )
{
cout << "WSAStartup failed, error " << Ret << endl;
return false;
}
return true;
}
void CleanWSA()
{
if ( WSACleanup() == SOCKET_ERROR )
{
cout << "WSACleanup failed, error " << WSAGetLastError() << endl;
}
}
void InitSockAddrByIP( SOCKADDR_IN *pSockAddr, const char *strIP, const int &nPortID )
{
pSockAddr->sin_family = AF_INET;// internetwork: UDP, TCP, etc.
pSockAddr->sin_port = htons( nPortID );
if ( 0 != strlen(strIP) )
{
pSockAddr->sin_addr.s_addr = inet_addr( strIP );
}
else
{
pSockAddr->sin_addr.s_addr = htonl( INADDR_ANY );
}
}
bool bindAddr( const SOCKADDR_IN *pSockAddr, SOCKET *pSocket )
{
int bindResult = bind( *pSocket, (sockaddr *)(pSockAddr), sizeof(*pSockAddr));
if ( SOCKET_ERROR == bindResult )
{
cout << "bind error :" << WSAGetLastError() << endl;
return false;
}
return true;
}
bool SetListener( SOCKET *pSocket, int backlog )
{
int nResult = listen( *pSocket, backlog );
if ( SOCKET_ERROR == nResult )
{
cout << "listen error :" << WSAGetLastError() << endl;
return false;
}
return true;
}
int main()
{
WSADATA wsadata;
if ( !InitWSA( MAKEWORD(2,2), &wsadata ) )
{
return 0;
}
SOCKADDR_IN InternetAddr;
char lStrIP[128] = "";
int lPortID = 5150;
InitSockAddrByIP( &InternetAddr, lStrIP, lPortID );
SOCKET lListenerSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( INVALID_SOCKET == lListenerSocket )
{
cout << "listener_socket creat failed " << endl;
return 0;
}
if ( !bindAddr( &InternetAddr, &lListenerSocket ) )
{
return 0;
}
if ( !SetListener( &lListenerSocket, REQUEST_BACKLOG ) )
{
return 0;
}
cout << "server started~~~ " << endl;
fd_set fdSocket;
FD_ZERO( &fdSocket );
FD_SET( lListenerSocket, &fdSocket );
while( true )
{
fd_set fdSocket_temp;
fdSocket_temp = fdSocket;
fd_set fdRead;
fdRead = fdSocket;
fd_set fdExceptds;
fdExceptds = fdSocket;
int nResult_select = select( 0, &fdRead, NULL, &fdExceptds, NULL );
if ( 0 < nResult_select )
{
unsigned int socket_count = fdSocket_temp.fd_count;
for ( unsigned int i=0; i< socket_count; i++ )
{
if ( FD_ISSET( fdSocket_temp.fd_array[i], &fdRead ) )
{
if ( fdSocket_temp.fd_array[i] == lListenerSocket )
{
if ( fdSocket.fd_count < FD_SETSIZE )
{
//接受新的连接
SOCKADDR_IN ClientAddr;
int addrlen = static_cast<int>(sizeof(ClientAddr)); //一定要赋值
SOCKET newClient_socket = accept( lListenerSocket, (sockaddr *)&ClientAddr, &addrlen );
if ( INVALID_SOCKET == newClient_socket )
{
cout << " accept error " << WSAGetLastError() << endl;
}
else
{
FD_SET( newClient_socket, &fdSocket );
cout << "find new connect: " << inet_ntoa( ClientAddr.sin_addr ) << endl;
}
}
else
{
cout<<"too much connections"<<endl;
continue;
}
}
else
{
//接收数据
char recvbuff[1024];
int ret = 0;
ret = recv( fdSocket_temp.fd_array[i], recvbuff, static_cast<int>( strlen(recvbuff) ), 0 );
if ( 0 < ret )
{
recvbuff[ret] = '\0';
cout << "recv : " << recvbuff << endl;
//回复
char backbuf[1024] = "receive info!";
send( fdSocket_temp.fd_array[i], backbuf, static_cast<int>( strlen(backbuf) ), 0 );
}
else
{
//该连接断开
closesocket( fdSocket_temp.fd_array[i] );
FD_CLR( fdSocket_temp.fd_array[i], &fdSocket );
}
}
}
else if( fdSocket_temp.fd_array[i] != lListenerSocket )
{
//该连接断开
closesocket( fdSocket_temp.fd_array[i] );
FD_CLR( fdSocket_temp.fd_array[i], &fdSocket );
}
if ( FD_ISSET( fdSocket_temp.fd_array[i], &fdExceptds ) && (fdSocket_temp.fd_array[i] != lListenerSocket) )
{
//该连接断开
closesocket( fdSocket_temp.fd_array[i] );
FD_CLR( fdSocket_temp.fd_array[i], &fdSocket );
}
}//end for
}
else if( SOCKET_ERROR == nResult_select )
{
cout << "select error : " << WSAGetLastError() << endl;
return 0;
}
Sleep( 50 ); //不要挑战你的机器
}//end while
closesocket( lListenerSocket );
CleanWSA();
return 0;
}