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前最好都要...
  • God2469
  • God2469
  • 2013年04月05日 15:04
  • 7619

TCP Echo Server(select)

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

基于select和epoll的Echo服务器与客户端编程

epoll——sever#include #include #include #include #include #include #include #include #include #incl...

用select实现TCP回射程序(服务器及客户端)

该程序系参考《UNP》来编写的,主要用来练习select及shutdown函数的使用。服务器代码#include #include #include #include #include #i...

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

Linux下的单进程多用户TCP服务器,采用select方法实现。 /************************************************* * File nam...
  • wjs1033
  • wjs1033
  • 2014年05月06日 11:36
  • 639

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

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

实现TCP并发服务器之三(select函数)

前面两篇介绍用进程方式和线程方式实现并发服务,其实里面调用send,read,accept函数都会导致阻塞,而linux的select函数可以使我们在程序中同时监听多个文件描述符的读写状态。程序会停在...
  • ciaos
  • ciaos
  • 2012年07月04日 08:08
  • 1851

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...

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

Linux下的单进程多用户TCP服务器,采用select方法实现。 [cpp] view plaincopy /********************...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:select 实现 tcp echo 服务器
举报原因:
原因补充:

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