博客信息 |
blog名称:拓扑空间 日志总数:8 评论数量:3 留言数量:0 访问次数:26564 建立时间:2007年7月26日 |
最新公告 |
| 经过剑桥三一学院,我以牛顿之名许愿,当空间只剩下拓扑的语言,映射就成了永垂不朽的诗篇,用超越数去超越永远,一万年不变. |
友情链接 |
|
其他信息 |
|
|
|
|
|
|
|
|
|
|
用Linux C写了一个局域网的聊天程序,基本实现了服务端能读取客户端的数据,采用I/O多路复用技术实现了异步读入,客户端的任何一个成员发送的消息都能在服务端显示,稍后专门对Select()函数的应用作详解。
客户端的任一个成员发送的消息,其它成员都能读取,以实现聊天功能,主要采用fork机制,函数一开始就调用fork分为父进程和子进程,子进程把从服务端来的行拷贝到标准输出,父进程把从标准输入的行拷贝到服务端。
500)this.width=500'>
服务端Select()函数应用:
其函数原型为:
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
此函数的功能是由内核检测在timeout时间内,是否有readfds,writefds,exceptfds三个句柄集(file descriptors)里的某个句柄(file descriptor)的状态符合寻求,即readfds句柄集里有句柄可读或writefds句柄集里有可写或exceptfds句柄集里有例外发生,任何一个有变化函数就立即返回,返回值为timeout发生状态变化的句柄个数。
n是所有readfds,writefds,exceptfds三个句柄集(file descriptors)里编号最大值加1。比如:要检测两个socket句柄fd1和fd2在timeout时间内是否分别可读和可写就可以这样:
先把两个句柄集(file descriptors)清零:
FD_ZERO (&readfds);
FD_ZERO (&writefds);
然后把fd1加入读检测集:
FD_SET (fd1, &readfds);
然后把fd2加入写检测集:
FD_SET (fd2, &writefds);
客户端fork调用:
void str_cli(char *name,FILE *fp, int sockfd)
{
int len= BUF_SIZE;
char sendline[BUF_SIZE], recvline[BUF_SIZE];
char sendline2[BUF_SIZE];
pid_t pid;
pid = fork();
if(pid == 0){
for(;;){
len = recv(sockfd, recvline, len,0);
if(len ==0)
exit(0);
fputs(recvline, stdout);
}
}else{
for(;;){
strcpy(sendline2,name);
if (fgets(sendline, BUF_SIZE, fp) == NULL) {
shutdown(sockfd, SHUT_WR);
exit(0);
}
strcat(sendline2,sendline);
if(send(sockfd, sendline2, len,0)<=0){
perror("send");
}
}
}
}
以下是程序最终运行结果:
500)this.width=500'> |
[
阅读全文(3781) | 回复(0) | 编辑 | 精华] |
|
|
|