免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4757 | 回复: 19
打印 上一主题 下一主题

为什么有fork了就会accept: Invalid argument [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-15 23:27 |只看该作者 |倒序浏览

  1.         while(1) {
  2.                 tmp_sd = accept(sd, (struct sockaddr*)&tmp_sin, &len);
  3.                 if (tmp_sd == -1) {
  4.                         perror("accept");
  5.                         exit(0);
  6.                 }
  7.                
  8.                 //check client ip
  9.                        
  10.                 //fork
  11.                 pid = fork();
  12.                 switch(pid) {
  13.                         case -1:
  14.                                 perror("fork");
  15.                                 break;
  16.                         case 0:
  17.                                 _exit(0);
  18.                 }
  19.                
  20.                 close(tmp_sd);
  21.         }
复制代码

假如没有fork这部分的话, 正常. 有fork了就会出错.
当telnet的时候显示:
accept: Invalid argument

论坛徽章:
0
2 [报告]
发表于 2005-11-16 00:17 |只看该作者
不会吧...没人知道?
这个应该很简单的吧......

论坛徽章:
0
3 [报告]
发表于 2005-11-16 08:52 |只看该作者
不说别的,你的fork有什么用?子进程退出了没有,你判断或者管理了吗?

论坛徽章:
0
4 [报告]
发表于 2005-11-16 11:46 |只看该作者

  1.                 pid = fork();
  2.                 switch(pid) {
  3.                         case -1:
  4.                                 perror("fork");
  5.                                 break;
  6.                         case 0:
  7.                                 _exit(0);
  8.                 }
复制代码

那个不是吗?_exit(0)不是退出吗?
我是想父进程accept之后, 产生子进程处理负责具体事务
父进程就不管它了.假如要waitpid的话, 那不是要等待了吗?
可我这里就一个fork就出错也太...子进程难道会去执行accept?

论坛徽章:
0
5 [报告]
发表于 2005-11-16 12:27 |只看该作者
全部

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <unistd.h>

  8. const int port = 2628;

  9. int tcp_listen_socket(void);

  10. int main(int argc, char* argv[])
  11. {
  12.         int sd, tmp_sd;
  13.         struct sockaddr_in tmp_sin;
  14.         unsigned int len;
  15.         pid_t pid;
  16.        
  17.         sd = tcp_listen_socket();

  18.         while(1) {
  19.                 tmp_sd = accept(sd, (struct sockaddr*)&tmp_sin, &len);
  20.                 if (tmp_sd == -1) {
  21.                         perror("accept");
  22.                         exit(0);
  23.                 }
  24.                
  25.                 //check client ip
  26.                 //fork
  27.                 pid = fork();
  28.                 if (pid==0) _exit(0);       
  29.                
  30.                 close(tmp_sd);
  31.         }
  32.        
  33.         return 0;       
  34. }


  35. int tcp_listen_socket()
  36. {
  37.         int sd;
  38.         struct sockaddr_in sin;
  39.         int ret;
  40.        
  41.         sd = socket(AF_INET, SOCK_STREAM, 0);
  42.         if (sd == -1) {
  43.                 perror("socket");
  44.                 exit(0);
  45.         }
  46.        
  47.         memset(&sin, 0, sizeof sin);
  48.         sin.sin_family = AF_INET;
  49.         sin.sin_addr.s_addr = htonl(INADDR_ANY);
  50.         sin.sin_port = htons(port);
  51.         ret = bind(sd, (struct sockaddr*)&sin, sizeof sin);
  52.         if (ret == -1) {
  53.                 perror("bind");
  54.                 exit(0);
  55.         }
  56.        
  57.         ret = listen(sd, 20);
  58.         if (ret == -1) {
  59.                 perror("listen");
  60.                 exit(0);
  61.         }
  62.        
  63.         return sd;
  64. }
复制代码

有fork就错啊...我又没干什么事情...子进程直接退出了啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-11-16 13:02 |只看该作者
原帖由 yarco1 于 2005-11-16 12:27 发表
全部
[code]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include &l ...

这个程序我编译一点问题也没有。
找别的原因吧。
gcc 3.4.4

论坛徽章:
0
7 [报告]
发表于 2005-11-16 13:12 |只看该作者
啊...谢谢...
那个...
编译是可以, 运行之后, 再telnet localhost 2628就出错了
显示: accept: Invalid argument
然后这个程序就退出了...

不知道您那里...

o...我想我没说明白...
去掉
//fork
...
那部分的话,
我运行
$./xxx &
$telnet localhost 2628
没问题.

但是加上fork那部分.
$ ./xxx &
$ telnet localhost 2628
$ accept: Invalid argument
[1]+  Done                   xxx
就退出了...

[ 本帖最后由 yarco1 于 2005-11-16 13:20 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-11-16 13:21 |只看该作者
原帖由 yarco1 于 2005-11-16 13:12 发表
啊...谢谢...
那个...
编译是可以, 运行之后, 再telnet localhost 2628就出错了
显示: accept: Invalid argument
然后这个程序就退出了...

不知道您那里...

o...我想我没说明白...
去掉
//fork
...
...

这个能用telnet吗?
telnet不是有自己的协议嘛。

论坛徽章:
0
9 [报告]
发表于 2005-11-16 13:27 |只看该作者
不能用吗?
那为什么telnet localhost 80就可以得到网ye啊?
...

yun死...我一直靠telnet测试的啊...
假如没有//fork, 然后写一条:
send(tmp_sd, "i love you!n", strlen("i love you!n"), 0);
telnet localhost 2628
就可以收到的啊...

yun了...那你们怎么测试的??

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-11-16 13:31 |只看该作者
原帖由 yarco1 于 2005-11-16 13:27 发表
不能用吗?
那为什么telnet localhost 80就可以得到网ye啊?
...

yun死...我一直靠telnet测试的啊...
假如没有//fork, 然后写一条:
send(tmp_sd, "i love you!n", strlen("i love you!n&quo ...

我以前都是写一个客户端程序来测试。
不过很久不弄了,现在好多都忘了。
我对telnet协议也不太了解,
不清楚你用telnet和服务器段是怎么交互的。
比如怎么发请求,怎么去接收返回信息等等。
建议你了解一下telnet协议。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP