无论如何在fd_set中打印套接字的状态?
说我有这段代码:
int main(int argc, char * argv[]) {
int sockfd, newfd, i;
struct sockaddr_un sv_addr, cli_addr;
int sv_len, cli_len;
fd_set testmask, mask;
if ((sockfd = socket(AF_UNIX,SOCK_STREAM,0))<0) {
perror("Error creating socket");
exit(-1);
}
bzero((char*)&sv_addr,sizeof(sv_addr));
sv_addr.sun_family = AF_UNIX;
strcpy(sv_addr.sun_path,UNIXSTR_PATH);
sv_len=sizeof(sv_addr.sun_family)+strlen(sv_addr.sun_path);
unlink(UNIXSTR_PATH);
if(bind(sockfd,(struct sockaddr*)&sv_addr,sv_len)<0) {
perror("Error binding socket");
exit(-1);
}
listen(sockfd, 15);
FD_ZERO(&testmask);
FD_SET(sockfd,&testmask);
for(;;) {
mask = testmask;
select(MAXSOCKS,&mask,0,0,0);
if(FD_ISSET(sockfd,&mask)) {
cli_len = sizeof(cli_addr);
newfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
echo(newfd);
close(newfd);
}
for(i=0;i<MAXSOCKS;i++) {
if (FD_ISSET(i, &mask)) {
close(i);
FD_CLR(i, &mask);
}
}
}
close(sockfd);
return 0;
}
一切都在我的程序中运行(它是一个echo服务器,客户端发送一条线路,服务器只是回复它)。 我想在选择呼叫之后,在服务器终端上打印一些类似的东西; 00011011011 这意味着,打印准备好处理的袜子。 无论如何我能做到吗?
另外,在for循环结束时我该怎么办?我知道我必须以某种方式清除fd_set。我这样做的方式(小循环结束和FD_CLR fd_set)是正确的吗?或者我应该以另一种方式做到这一点?
PS:对不起我的英语或任何错误。 :)
答案 0 :(得分:2)
[这不会回答您的问题,但是refers to a comment to the OP并且对于其他评论而言太长了]
来自man select
:
nfds是三组中任何一组中编号最高的文件描述符,加上1。
nfds
不是常数!手册页不读取:
[...]最高可能的编号文件描述符[...]
nfds
动态地描述传递给fd_set
的{{1}}。
select()
为要添加到 int nfds = sockfd + 1;
for(;;) {
mask = testmask;
select(nfds, &mask, 0, 0, 0);
if(FD_ISSET(sockfd,&mask)) {
cli_len = sizeof(cli_addr);
newfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
echo(newfd);
close(newfd);
}
for(i = 0; i < nfds; ++i) {
if (FD_ISSET(i, &mask)) {
close(i);
FD_CLR(i, &mask);
}
}
}
的{{1}}的每个套接字描述符调整nfds
。
答案 1 :(得分:0)
选择通话后,您检查了sockfd。如果这是真的,则意味着客户端尝试连接您的服务器。然后你接受连接。
newfd = accept(sockfd,(struct sockaddr *)&amp; cli_addr,&amp; cli_len);
newfd是您知道的客户端和服务器之间的fd编号。在这里,您还没有读取clientfd(newfd)数据。接受连接后,您可以读取clentfd上的数据
读取(newfd,缓冲液,的sizeof(缓冲液))
您的数据从客户端发送,现在在缓冲区中。那么也许你可以在clientfd中回显或写()。
您的代码发送到客户端,服务器和客户端之间的fd编号。
此外,如果始终监听客户端,在接受连接之后,您必须将您的客户端fd设置为readfds(代码中的掩码),如FDSET(newfd,&amp; mask)
然后你总是可以听客户端