Windows网络编程示例一——简单的echo服务器

如下代码是一个 简单的echo服务器,它示例的一些Winsock函数的用法。

#include  < iostream >
using   namespace  std;

#ifdef WIN32

#   include 
< WinSock2.h >
/// 也可在setting/liker/input/Additional dependencies加入导入库引用
#   pragma comment(lib " ws2_32.lib " )

/// 包含AcceptEx,TransmitFile,DisconnectEx等函数
#   include  < mswsock.h >
#   pragma comment(lib, " Mswsock.lib " )

#   define PRINT_SOCKET_ERROR(FUNC) 
    
do  
    

    cout 
<< "<" << #FUNC << "> Call Error!" << " " 
    
<< "Error Number : " << WSAGetLastError() << endl; 
    }
  while ( 0 )

#endif   //  WIN32

#define  PORT 5432

int  main( int  argc,  char *  argv[])
{
    
// = 初始化Lib库
    int nRet;
    WSAData wsaData;
    
if ((nRet = WSAStartup(0x0202&wsaData)) != 0)
    
{   
        PRINT_SOCKET_ERROR(WSAStartup);
        
return -1;
    }


    
// = 设置监听socket句柄
    SOCKET hListen;

    
/// #1 
    if ((hListen = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    
{
        PRINT_SOCKET_ERROR(socket);
        
return -1;
    }


    
/// #2
    SOCKADDR_IN hostAddr; 
    
{
        u_long nIp 
= htonl(INADDR_ANY);
        
{
            
/// 相关函数示例
            char szHostName[256= {0};
            gethostname(szHostName, 
256);
            hostent
* thisHost = gethostbyname(szHostName);
            nIp 
= inet_addr(inet_ntoa(*((in_addr*)thisHost->h_addr_list[0])));
        }

        hostAddr.sin_family 
= AF_INET;
        hostAddr.sin_port 
= htons(PORT);
        hostAddr.sin_addr.s_addr 
= nIp;
    }
   
    
    
if ((nRet = bind(hListen, (PSOCKADDR)&hostAddr, sizeof(SOCKADDR_IN))) != 0)
    
{
        PRINT_SOCKET_ERROR(bind);
        
return -1;
    }


    
/// #3
    if ((nRet = listen(hListen, 5)) != 0)
    
{
        PRINT_SOCKET_ERROR(listen);
        
return -1;
    }

    
else
    
{
        cout 
<< "Listening at " << inet_ntoa(hostAddr.sin_addr) 
             
<< ":" << ntohs(hostAddr.sin_port) << endl;
    }


    
// = 处理请求
    SOCKET hConnected;
    SOCKADDR_IN remoteAddr;
    
int remote_addr_size = sizeof(SOCKADDR_IN);
    
if ((hConnected = accept(hListen, (PSOCKADDR)&remoteAddr, &remote_addr_size)) == INVALID_SOCKET)
    
{
        PRINT_SOCKET_ERROR(accept);
        
return -1;
    }

    
else
    
{
        cout 
<< "Connect from " << inet_ntoa(remoteAddr.sin_addr) 
             
<< ":" << ntohs(remoteAddr.sin_port) << endl;        
    }


    
// = 数据收发
    do
    
{
        
char buffer[1024= {0};
        
int recv_bytes = recv(hConnected, buffer, 10240);
        
if (recv_bytes == -1)
        
{
            PRINT_SOCKET_ERROR(recv);
            
break;
        }

        
else if (recv_bytes == 0)
        
{  
             /// 客户端关闭了链接
            cout 
<< "Connection closed from " << inet_ntoa(remoteAddr.sin_addr)
                 
<< ":" << ntohs(remoteAddr.sin_port) << endl;
            closesocket(hConnected);
            break;
        }

        
else
        
{
            buffer[recv_bytes] 
= 0;
            cout 
<< buffer; cout.flush();
            
int send_bytes = send(hConnected, buffer, recv_bytes, 0);
            
if (send_bytes != recv_bytes)
            
{
                cout 
<< "Not send out all data!" << endl;
            }

        }


    }
 while (1);

    closesocket(hListen);

    // = 清理Lib库
    if (WSACleanup() !=  0)
    
{
        PRINT_SOCKET_ERROR(WSACleanup);
        
return -1;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值