winsock编程基础代码

在网上搜集的,如图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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值