Advance .Net

导航

 
由于C socket的使用对命名使用很不方便,所以对其进行了简单的封装,代码如下:
class IPAddress
{
public:
    
struct sockaddr_in address;
public:
    IPAddress()
    
{
        address.sin_addr.S_un.S_addr
=INADDR_ANY;
        address.sin_family
=AF_INET;
        address.sin_port
=htons(0);
    }


    IPAddress(
char* ip,int port)
    
{
        address.sin_addr.S_un.S_addr
=inet_addr(ip);
        address.sin_family
=AF_INET;
        address.sin_port
=htons(port);
    }


    sockaddr_in GetAddress()
    
{
        
return address;
    }


    
char* GetIP()
    
{
        
return inet_ntoa(address.sin_addr);
    }

    
int GetPort()
    
{
        
return address.sin_port;
    }


}
;



class TcpClient
{
public:
    IPAddress addr;
    IPAddress remoteAddr;
    
    
int sockflag;
    
bool success;
public:
    TcpClient()
    
{
        
        success
=true;
        sockflag
=socket(AF_INET,SOCK_STREAM,0);
        
if(sockflag==-1)
        
{
            success
=false;
            
return;
        }

        
        
if(bind(sockflag,(struct sockaddr*)&addr.GetAddress(),sizeof(struct sockaddr_in))==-1)
            success
=false;
    }


    TcpClient(
int sf)
    
{
        sockflag
=sf;
    }


    
char* GetRemoteIP()
    
{
        
return remoteAddr.GetIP();
    }


    
int GetRemotePort()
    
{
        
return remoteAddr.GetPort();
    }


    
void SetRemoteAddress(struct sockaddr_in remote)
    
{
        remoteAddr.address.sin_addr.S_un.S_addr
=remote.sin_addr.S_un.S_addr;
        remoteAddr.address.sin_family
=remote.sin_family;
        remoteAddr.address.sin_port
=remote.sin_port;
        
    }


    

    
bool Connect(char* ip,int port)
    
{
        
        remoteAddr.address.sin_addr.S_un.S_addr
=inet_addr(ip);
        remoteAddr.address.sin_family
=AF_INET;
        remoteAddr.address.sin_port
=htons(port);
        

        
int sin_size=sizeof(struct sockaddr_in);
        
if(connect(sockflag,(struct sockaddr*)&remoteAddr,sin_size)==-1)
            
return false;
        
else
            
return true;

    }


    
int Send(char* msg,int len)
    
{
        
int l = send(sockflag,msg,len,0);
        
return l;
    }


    
int Receive(char* buf,int len)
    
{
        
        
return recv(sockflag,buf,len,0);
    }

    
bool Close()
    
{
        
if(shutdown(sockflag,2)==-1)
            
return false;
        
else
            
return true;
    }


}
;




class TcpListener
{
private:
    
int sockflag;
    
bool success;
public:
    TcpListener(IPAddress addr)
    
{
        success
=true;
        sockflag
=socket(AF_INET,SOCK_STREAM,0);
        
if(sockflag==-1)
        
{
            success
=false;
            
return;
        }

        
if(bind(sockflag,(struct sockaddr*)&addr.GetAddress(),sizeof(struct sockaddr_in))==-1)
            success
=false;
        
    }


    
bool Listen()
    
{
        
if(listen(sockflag,20)==-1)
            
return false;
        
else
            
return true;
    }


    TcpClient Accept()
    
{
        
struct sockaddr_in remote;
        
int remoteSize=sizeof(struct sockaddr_in);
        
int newSock = accept(sockflag,(struct sockaddr*)&remote,&remoteSize);
        TcpClient c(newSock);

        c.SetRemoteAddress(remote);
        

        
return c;

    }


    
bool Close()
    
{
        
        
if(shutdown(sockflag,2)==-1)
            
return false;
        
else
            
return true;

    }


    

}
;




posted on 2008-07-17 10:01  胡振  阅读(721)  评论(1)    收藏  举报