select 实现 tcp echo 服务器

原创 2007年09月24日 16:57:00
 
#include <iostream>
#include 
<winsock2.h>
#include 
<vector>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

#define PORT 12345
#define BUFFER_SIZE 1024

int main(int argc, char* argv[])
{
    WSADATA wsaData;
    
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
    {
        std::cout 
<< " lib error  ";
        WSACleanup();
        
return -1;
    }

    SOCKET listenSocket;
    
if((listenSocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET)
    {
        std::cout 
<< "socket error ";
        WSACleanup();
        
return -1;
    }

    SOCKADDR_IN addr;
    memset(
&addr,0sizeof(addr));    
    addr.sin_family 
= AF_INET;
    addr.sin_port 
= htons(PORT);
    addr.sin_addr.s_addr 
= htonl(ADDR_ANY);
    
    
if(bind(listenSocket,(sockaddr*)&addr,sizeof(addr)) == SOCKET_ERROR)
    {
        std::cout 
<< "bind error ";
        WSACleanup();
        
return -1;
    }
    listen(listenSocket,
100);
    
    
//将socket设为nonBlock
    u_long nonBlock = 1;
    
if(ioctlsocket(listenSocket,FIONBIO,&nonBlock) == SOCKET_ERROR)
    {
        printf(
"ioctlsocket() error ");
        
return -1;
    }

    FD_SET readSet;
    FD_SET writeSet;
    
    
    vector
<SOCKET> socketArray; 
    
char buf[BUFFER_SIZE];

    
for(;;)
    {
        FD_ZERO(
&readSet);
        
//FD_ZERO(&writeSet);

        
//将listen socket加入,测试是否有新连接
        FD_SET(listenSocket,&readSet);
        
        
//将连接的socket加入readset,测试是否可读
        vector<SOCKET>::iterator it;
        
for(it = socketArray.begin(); it != socketArray.end(); ++it)
        {
            FD_SET(
*it,&readSet);
            
//FD_SET(*it,&writeSet);
        }

        
int total = select(0,&readSet,0,NULL,0); //阻塞直到有socket可读
        if(total == SOCKET_ERROR)
        {
            printf(
"select() error ");
            
return -1;
        }

        
//判断是否有新连接
        if(FD_ISSET(listenSocket,&readSet))
        {
            SOCKADDR_IN connectAddr;
            
int len = sizeof(connectAddr);
            SOCKET socket 
= accept(listenSocket,(sockaddr*)&connectAddr,&len);
            cout 
<< "new connecter: " << inet_ntoa(connectAddr.sin_addr) <<":" << ntohs(connectAddr.sin_port)<< endl;
            socketArray.push_back(socket);
            total
--;            
        }
        
        
//检查数组中的socket是否可读
        for(it = socketArray.begin(); total > 0 && it != socketArray.end();)
        {
            
if(FD_ISSET(*it,&readSet))
            {
                total
--;
                
int ret = recv(*it,buf,1024,0);
                
if(ret == 0)//对方关闭连接
                {
                    closesocket(
*it);
                    it 
= socketArray.erase(it);//从数组中删除该socket
                }
                
else
                {
                    send(
*it,buf,ret,0);//echo
                }            
            
            }
            
/*

            if(FD_ISSET(*it,&writeSet))
            {
                
            }
            
*/
            it
++;
        }
            
    }

    
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux select实现的TCP echo

该文主要是用select实现了一个TCP的echo,客户端连接到服务器端,发送数据,服务器端直接回复原数据给客户端。客户端发送quit则服务器终止。 需要注意的是: 1、每次select前最好都要...

TCP Echo Server(select)

到现在,我Unix,数据库的扫盲基本完成了,就差网络这一块了。从今天开始网络扫盲。上周五开始看HTTPD的实现,我们的httpd是AA(AA是我们SBE的元老之一)开发的,只要是AA开发的东西,学习一...

Linux网络编程:TCP服务器(单进程多用户),使用select方法实现

Linux下的单进程多用户TCP服务器,采用select方法实现。 /************************************************* * File nam...

select实现tcp并发服务器的基本框架流程

服务端初始化: socket(); bind(); listen(); for( ; ; )    {         FD_SET(listen_fd , &allset);//设置监听读写文件...

使用Select I/O模型来实现一个并发处理多个客户端的TCP服务器

#include #include #pragma comment(lib, “ws2_32.lib”) int main() { // 加载win socket WSAD...

Select I/O模型来实现一个并发处理多个客户端的TCP服务器

#include #include #pragma comment(lib, “ws2_32.lib”) int main() { // 加载win socket WSADATA ...

Linux网络编程:TCP服务器(单进程多用户),使用select方法实现

Linux下的单进程多用户TCP服务器,采用select方法实现。 [cpp] view plaincopy /********************...

TCP Echo 服务器

Windows版的EchoServer #include #include #include #pragma comment(lib,"ws2_32.lib") BOOL InitSock();...

Linux网络编程(2)简单的TCP回射服务器(Echo Server)

简单的TCP回射服务器

TCP多线程并发服务器+线程池+echo

这个架构很简单,在《Unix网络编程》
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)