常用的socket例子

常用的socket例子

关闭连接
shutdown(m_sock,SHUT_RDWR)   //成功返回0,错误-1

设置超时
    struct timeval    tv;
    tv.tv_sec=ms/1000;
    tv.tv_usec=(ms%1000)*1000;
    setsockopt(s,1,SO_SNDTIMEO,&tv,sizeof(tv));
    //int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

读数据
int    Read(char* szBuf,int nLen,int ms/* =-1 */)
{
    int    lenRecv=0,len,flags=0;
    //check socket valid?
    //SetTimeOut(ms,1);
    for(;nLen>0;nLen-=len) {
         len=nLen>1024?1024:nLen;
        len=recv(m_sock, szBuf,len,0);
         if(len==0) {
            // remote closed the socket
            //SetTimeOut(0,1);
            return 0;
        }
         if(len<0)  return -1;
         szBuf+=len;
        lenRecv+=len;
    }
    //SetTimeOut(0,1);
    return lenRecv;

发送send
    int sndbuf=1024;
    int flags=0;
    int len;
    for(;nLen>0;nLen-=sndbuf) {
         nNeedSnd=nLen>sndbuf?sndbuf:nLen;
        len=send(m_sock,buf,nNeedSnd,flags);
         if(len==-1) return -1;
        buf+=nLen>sndbuf?sndbuf:nLen;
        lenSent+=len;
    }

连接
int    Connect(DWORD ip,int nPort)
{
    //判断m_sock是否已经打开.如果是,关闭

     m_sock=socket(AF_INET,SOCK_STREAM,0);
    if(m_sock==-1) {   //返回值应该不是0,1,2. 除非是deamon
        return ERR_SOCKET;
    }

     struct sockaddr_in sa;
    memset(&sa,0,sizeof(sa));
    sa.sin_family=AF_INET;
    sa.sin_addr.s_addr=ip;
    sa.sin_port=htons(nPort);


    //connect成功返回0,其余-1
    if(0!= connect(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
        closesocket(m_sock);
        m_sock=-1;
        return ERR_CONNECT;
    }
    return 0;
}

listen和bind
    //使得退出后端口马上可用
    int    boptval = 1;
    setsockopt(m_sock, 1, SO_REUSEADDR, (const char*)&boptval, sizeof(boptval));

    struct sockaddr_in sa;
    memset(&sa,0,sizeof(sa));

    sa.sin_family=AF_INET;

    //0x01000007f表示localhost
     *(u_long*)&sa.sin_addr=bLocal?0x0100007f:(ip?inet_addr(ip):INADDR_ANY);
    if(nPort) sa.sin_port= htons(nPort);
    if(bind(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
        closesocket(m_sock);
        m_sock=INVALID_SOCKET;
        return ERR_SOCKET;
    }
        

    struct sockaddr_in name;
    socklen_t    len=sizeof(name);
     getsockname(m_sock,(struct sockaddr*)&name,&len);//取回socket的port ,以确定是否绑定了需要的端口

    if( listen(m_sock, SOMAXCONN)) {
        closesocket(m_sock);
        m_sock=INVALID_SOCKET;
        return ERR_LISTEN;
    }
    return ntohs(name.sin_port);

socket是否可读写
int    IsReadyRead(SOCKET s,int ms/* =0 */)
{
    if(s==-1)
        return 0;
    struct timeval    tv;
    fd_set    fs;
    tv.tv_sec=ms/1000;
    tv.tv_usec=(ms%1000)*1000;
    FD_ZERO(&fs);
    FD_SET(s,&fs);
    if(select(s+1,&fs,0,0,&tv)<=0) {
        return 0;
    }
    return 1;
}

设置nonblock
    int    flags = fcntl(s, F_GETFL, 0);
    fcntl(s, F_SETFL, flags|O_NONBLOCK);   //设置
    fcntl(s, F_SETFL, flags & ~O_NONBLOCK);//重置

判断ip还是域名并返回s_addr
DWORD    InetAddr(const char* host)
{
     struct hostent* h=gethostbyname(host);
    unsigned long ip= INADDR_NONE;

    //如果是域名
    if(h) {
        ip=*(unsigned long*)(h->h_addr_list[0]);
    } 
    //如果是ip地址
    else if(( ip=inet_addr(host))==INADDR_NONE) {
        return ip;
    }
    return ip;
}

poll用法
struct pollfd pfd[1];
pfd[0].fd=sockfd;
pfd[0].events= POLLRDNORM;
while(1)
{
    switch(poll(pfd,0+1,timeout_second))    
    {
        case -1:
            perror("error");
            continue;
        case 0:    
            / /timeout
            continue;
        default:
        {
             if(pfd[0].revents&POLLRDNORM)
                //accept() and add
        }
    }
}

0
0
 
 
猜你在找
python网络编程(socket)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值