为什么在fork中要close一下listen返回的值

qjzrd 2010-04-15 04:11:42
最近在网上看别人写的sock + fork 中有close一下listen的返回值,不知道为什么要这么做


代码如下:

int main(int argc, char **argv)
{
int fd;
int address_len;
struct sockaddr_in address;
int listenfd;
if(readFile()==0)
{
printf("read record failed!\n");
}
fd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(1234);
address_len = sizeof(address);
bind(fd, (struct sockaddr *)&address, address_len);
listenfd = listen(fd, 64);
while(1) {
struct sockaddr_in client_address;
int len;
int client_sockfd;
char *data = "client end!\n";
char data2[datasize];
pid_t pid;
printf("waiting...\n");
fflush(stdout);
len = sizeof(client_address);
client_sockfd = accept(fd,
(struct sockaddr *)&client_address, &len);
if( (pid = fork()) == 0){
printf("%d\n",client_sockfd);
close(listenfd);
int i;
struct logininfo login;
intimebind(&login);
bzero((void *)data2, datasize);
read(client_sockfd,login.name,20);
for(i=0;i<3;i++)
{
read(client_sockfd,data2,datasize);
printf("server read line:%s\n", data2);
}
send(client_sockfd,data,strlen(data),0);
printf("server send line:%s\n", data);
close(client_sockfd);
outtimebind(&login);
printf("%s\t %d\t %d\t %d\t %d\t %d\t %d\t %d \t%d \t%d\t %d\n",login.name,login.inyear,login.inmonth,login.inday,login.inhour,login.inmin,login.outyear,login.outmonth,login.outday,login.outhour,login.outmin);
newrecord(&login);
exit(0);
}
close(client_sockfd);
}
}
...全文
259 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2010-04-16
  • 打赏
  • 举报
回复

listenfd = socket(AF_INET, SOCK_STREAM, 0);
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
address.sin_port = htons(1234);
address_len = sizeof(address);
bind(fd, (struct sockaddr *)&address, address_len);
listen(listenfd, 64);
sanbailiushiliuye 2010-04-15
  • 打赏
  • 举报
回复
应该用accept的返回值作为read/write的套接口吧
kingteng 2010-04-15
  • 打赏
  • 举报
回复
刚才没有看程序,你这个程序不对吧,应该是用socket返回的值作为监听套接口,listen怎么会返回一个套接口。在紫禁城里关闭的也应该是socket返回的值
kingteng 2010-04-15
  • 打赏
  • 举报
回复
在listen的套接口被称为监听套接口,因为并发的需要,在监听套接口上accept到连接后,服务器会fork一个子进程,在子进程里用accept得到的套接口进行处理,这时候子进程就不需要监听套接口了,监听套接口需要继续在accept上等待,所以关闭
aozhi 2010-04-15
  • 打赏
  • 举报
回复
应该是个错误,不要那句话。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧