常用的socket例子

xiaoxiao2021-02-28  134

常用的socket例子 关闭连接 shutdown(m_sock,SHUT_RDWR)   //成功返回0,错误-1 设置超时     struct timeval    tv;     tv.tv_sec=ms/1000;     tv.tv_usec=(ms00)*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=(ms00)*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     上一篇sockaddr_in sockaddr in_addr区别联系[转] 下一篇linux下socket编写常用头文件

  相关文章推荐  进程间通信之-socket编程原理 linux socket编程以及简单的tcp,udp的例子 iOS常用三方库、插件、知名技术博客、常用开发工具使用介绍等等(Objective-C版本) (转)Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接) iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)  iOS开发-常用第三方开源框架介绍 Go语言TCP Socket通信编程 Socket详解 linux常用命令加实例大全 socket编程——一个简单的例子 猜你在找 python网络编程(socket)
转载请注明原文地址: https://www.6miu.com/read-23454.html

最新回复(0)