LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4240|回复: 32

请大虾指导一个socket问题

[复制链接]
发表于 2003-8-19 11:48:05 | 显示全部楼层 |阅读模式
我想编一个简单的http代理服务器,用socket.用Mozilla浏览器,在调试时老是出险accept 错误:Bad addres小弟百思不得其解,望高手指教!(Mozilla的代理和端口都设置过了)
发表于 2003-8-19 15:30:23 | 显示全部楼层
能不能把情况再说详细一些。
 楼主| 发表于 2003-8-19 15:35:49 | 显示全部楼层

程序的源代码

[php]
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define LISTENIEPORT 3333
#define TRANSPORT 3334
#define BACKLOG 10

main()
{
        int listeniesock,transock;//listenie and transinfo socket
        struct sockaddr_in local_addr;//local IP information
        struct sockaddr_in remote_addr;//remote client IE IP information

        //create listenie socket
        if((listeniesock=socket(AF_INET,SOCK_STREAM,0))==-1)
        {
                perror("socket create error!");
                exit(1);
        }
        printf("create socket OK!\n");
        bzero((char *)&local_addr,sizeof(local_addr));
        printf("bzero OK!\n");
        local_addr.sin_family=AF_INET;
        printf("local family AF_INET OK!\n");
        local_addr.sin_port=htons(LISTENIEPORT);
        printf("local port OK!\n");
        //local_addr.sin_addr.s_addr=inet_addr("182.4.1.26");
        local_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        printf("local address is %s\n",inet_ntoa(local_addr.sin_addr));
        //bzero(&(local_addr.sin_zero),8);
        //memset(&(local_addr.sin_zero),0,sizeof(local_addr.sin_zero));
        //bind listenie socket
        //printf("bzero OK!");
        if((bind(listeniesock,(struct sockaddr_in *)&local_addr,sizeof(struct sockaddr_in)))<0)
        {
                printf("error!\n");
                perror("bind error!\n");
                exit(1);
        }
        printf("bind socket OK!\n");
        //listen IE request
        if(listen(listeniesock,BACKLOG)==-1)
        {
                perror("listen error!\n");
                exit(1);
        }
        printf("listening......\n");

        while(1)
        {
                int sin_size=sizeof(remote_addr);
                if((transock=accept(listeniesock,(struct sockaddr_in *)&remote_addr,sin_size))==-1)
                {
                        perror("accept error!\n");
                        continue;
                }
                printf("accept one connet!\n");
                printf("recieved a connection from %s\n",inet_ntoa(remote_addr.sin_addr));
                if(!fork())
                {
                        //child process code segment
                }
                close(transock);
        }
}
[/php]
当我调试时,打开Mozilla输入一个网址就会出现Accept error!:Bad address.此问题困惑了我许久,清指教!
发表于 2003-8-19 23:54:10 | 显示全部楼层
这些问题同样困惑了我很久,但是,我经过反复调试,终于发现问题之所在。把这一句改成下面这样就行了:
if((transock=accept(listeniesock,(struct sockaddr_in *)&remote_addr,&sin_size))==-1)
以后不要犯这种低级错误。
 楼主| 发表于 2003-8-20 09:04:02 | 显示全部楼层

非常感谢楼主

楼主就是厉害!!!!问题终于解决了,终于可以睡个好觉了.感谢楼主大人!我是个菜鸟,以后还要请楼主多指教!
     还有个问题,为什么一个联结会输出十个accept one connect! recieve a connection from ...?还请楼主赐教!
发表于 2003-8-20 09:27:50 | 显示全部楼层

回复: 非常感谢楼主

最初由 nm47622791 发表
楼主就是厉害!!!!问题终于解决了,终于可以睡个好觉了.感谢楼主大人!我是个菜鸟,以后还要请楼主多指教!
     还有个问题,为什么一个联结会输出十个accept one connect! recieve a connection from ...?还请楼主赐教!

楼主?!!
你就是楼主呀,我帮你解决问题之后,你不感谢我,难道还要自己感谢自己?
恐怕是晚上没有睡觉,大脑糊涂了吧。别忘了,楼主可不是版主唷。呵呵。。。
第二个问题,我怀疑是fork()造成的,你把fork()去掉看看。
 楼主| 发表于 2003-8-20 09:58:50 | 显示全部楼层

感谢版主kj501

确实晕了,望版主莫怪!
     再次向您表示感谢!!!
    如果去掉fork()的话,那就要用select才能实现处理多用户了吧?
    还有一个问题:在一个局域网内,有一个网关连接外网,如果网内一台PC不设这个网关,但有物理连接,能不能用socket编写客户机/服务器的程序实现这台PC与网关的通信?:thank
 楼主| 发表于 2003-8-20 10:07:51 | 显示全部楼层

好像与fork()无关

我刚才把fork()注释掉了,但还是输出十次accept one connect! recieve a connection from ...
      我不理解.
发表于 2003-8-20 13:31:12 | 显示全部楼层

回复: 感谢版主kj501

最初由 nm47622791 发表
确实晕了,望版主莫怪!
     再次向您表示感谢!!!
    如果去掉fork()的话,那就要用select才能实现处理多用户了吧?
    还有一个问题:在一个局域网内,有一个网关连接外网,如果网内一台PC不设这个网关,但有物理连接,能不能用socket编写客户机/服务器的程序实现这台PC与网关的通信?:thank

网关既然连接在内网上,肯定有一个内网的ip。把包发到这个ip也一样。
 楼主| 发表于 2003-8-20 16:35:44 | 显示全部楼层

版主别嫌我烦,又有问题了

我的程序为什么开不了线程?我只在源程序里加了一句话:
if(!fork())

        {

            //child process code segment
            printf("child process success!\n");

        }
    调试时始终不能输出"child process success!"
   小弟既菜又笨,请版主再指导一下!
   先谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表