- 论坛徽章:
- 0
|
这个月打算把unix网络编程全部看一遍
/*
* file name: selects.c
* date: 2008/11/8
* name: zhou
*
*/
#include stdio.h>
#include stdlib.h>
#include string.h>
#include unistd.h>
#include sys/select.h>
#include sys/types.h>
#include sys/socket.h>
#include arpa/inet.h>
#define SA struct sockaddr
#define MAXCLI 10
#define LISMAX 5
#define MAXBUF 1024
int main(void)
{
int i, imax, maxfd, nready;
int lisfd, confd;
int clients[MAXCLI];
char readbuf[MAXBUF];
struct sockaddr_in seraddr;
fd_set rset, allset;
/* -----------------------初始化socket ---------------------------------- */
if ((lisfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error");
return 1;
}
bzero(&seraddr, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8899);
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(lisfd, (SA *)&seraddr, sizeof(seraddr)) == -1) {
perror("bind error");
return 1;
}
if (listen(lisfd, LISMAX) == -1) {
perror("listen error");
return 1;
}
// 初始化各变量
for (i = 0; i MAXCLI; i++) {
clients = -1;
}
imax = -1;
maxfd = lisfd;
FD_ZERO(&rset);
FD_ZERO(&allset); //忘记初始化
FD_SET(lisfd, &allset);
/* ---------------------------------------------------------------------- */
for ( ; ; ) {
rset = allset;
if ((nready = select(maxfd + 1, &rset, NULL, NULL, NULL)) == -1) {
perror("select error");
return 1;
}
if (FD_ISSET(lisfd, &rset)) { /* new connect */
if ((confd = accept(lisfd, NULL, NULL)) == -1) {
perror("accept error");
return 1;
}
for (i = 0; i MAXCLI; i++) {
if (clients == -1) {
clients = confd;
break;
}
}
if (i == MAXCLI) {
fprintf(stderr, "Too many connect\n");
}
if (i > imax) {
imax = i;
}
if (confd > maxfd) {
maxfd = confd;
}
FD_SET(confd, &allset);
if (--nready = 0) { //执行一个操作才减
continue;
}
}
int n;
for (i = 0; i = imax; i++) {
if (clients == -1) {
continue;
}
if (FD_ISSET(clients, &rset)) {
if ((n = read(clients, readbuf, sizeof(readbuf))) == 0) {
close(clients);
FD_CLR(clients, &allset);
clients = -1; //跟上一行交换了位置 结果FD_CLR老是段错误
}
//fprintf(stderr, "%s", readbuf);
write(clients, readbuf, n);
}
if (--nready = 0)
break;
}
}
}
遇到的错误:
1. close(clients);
FD_CLR(clients, &allset);
clients = -1; //跟上一行交换了位置 结果FD_CLR老是段错误
2. allset未初始化 select 返回数目老是不对
IO复用 select 函数
#include
#include
int select (int maxfd, fd_set *readset, fd_set *writeset,
fd_set *exceptset, const struct timeval *timeout);
返回:就绪描述字的正数目, 0 超时 -1 出错
void FD_ZERO(fd_set *fdset); 描述符集使用前必须初始化 未初始化select返回就绪的数目就不对
查了好半天
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set *fdset);
int FD_ISSET(int fd, fd_set *fdset);
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68452/showart_1389193.html |
|