server.c
#include #include #include #include #include #include #include #include #define max_login 20 //設定客戶端連線的最大數量
#define buflen 1024 //設定快取的大小
#define port 5000 //設定電腦埠
ssize_t readn(int fd,void *buf,size_t count);
ssize_t writen(int fd,void *buf,size_t count);
void ehandle(char *mesg);
int main()
fd_zero(&rfds);
fd_zero(&readfds);
fd_set(listenfd,&readfds);
maxfd = listenfd;
while(1)
while(nready < 0 && eintr == errno); //避免因為其他中斷引起select異常
if(-1 == nready)
ehandle("select");
if(fd_isset(listenfd,&rfds)) //處理監聽到的客戶端套接字
}if(--nready <=0) //nready 減一,優化程式
continue;
} for(i = 0;i 0)
if(fd_isset(clifd[i],&rfds)) //因為用了兩個集合,rfds和readfds,而這裡一定要用rfds,錯了就會只能與第乙個鏈結成功的客戶端通訊。
else //正常處理
if(--nready <= 0) //nready 減一,如果不為零,則繼續處理其他的,同時被啟用的客戶端
break;
}} }
close(listenfd);
return 0;
}void ehandle(char *mesg) //錯誤處理
ssize_t readn(int fd,void *buf,size_t count) // 讀取固定位元組數函式,避免粘包問題,這種處理方式效率不高
else if(0 == nread)
break;
nleft -= nread;
pbuf += nread;
} return (count - nleft);
}ssize_t writen(int fd,void *buf,size_t count) //寫入固定位元組數函式,避免粘包問題,這種處理方式效率不高
else if(0 == nwrite)
continue;
nleft -= nwrite;
pbuf += nwrite;
} return (count - nleft);
}
client.c
#include #include #include #include #include #include #include #include #define port 5000
#define ip "127.0.0.1"
#define buflen 1024
void ehandle(char *mesg)
ssize_t readn(int fd,void* buf,size_t count)
else if (0 == nread)
break;
nleft -= nread;
pbuf += nread;
} return (count -nleft);
}ssize_t writen(int fd,void *buf,size_t count)
else if(0 == nwrite)
continue;
nleft -= nwrite;
pbuf += nwrite;
} return (count - nleft);
}int main()
if(fd_isset(myfd,&readfds))
printf("receive :%s",strbuf);
}} }
/* while(1)
printf("receive :%s\n",strbuf);
}*/
close(myfd);
return 0;
}
ps:1 在debian 7上進行過簡單測試,成功。
2 如果客戶端或者伺服器端用readn 和writen函式,則伺服器端或客戶端也必須用這個兩個函式,否則不能正常回射。
linux 網路程式設計 select
include include include include include include include include include include include include typedef struct st fd def 將fd接收套接字描述符放入到fd陣列中 int add f...
Linux網路程式設計之select
使用select多路復用技術的非阻塞模型 select多路復用通常具有很好的跨平台性,也能提供不錯的併發效能,但是在通常情況下有最大監聽檔案描述符的限制 通常1024 如果不需要達到c10k這種前端高效能伺服器的要求,採用select nonblocking的方式能降低程式設計的難度 用到的介面 f...
Linux網路程式設計 select函式詳解
作用 select函式是用來監視乙個或多個檔案控制代碼的狀態變化的,可阻塞也可不阻塞。函式原型 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout 函式引數意義 fd m...