免费注册 查看新帖 |

Chinaunix

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

使用bcopy和bzero的疑问??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-11 04:54 |只看该作者 |倒序浏览
为什么使用bcopy和bzero两个函数的时候,有时候程序运行到那里会莫名其妙的停在那里? 这种情况好象在main函数中不会出现, 但如果是我自己定义的函数中调用这两个函数就会有问题。

希望各位大虾指点迷津!

论坛徽章:
0
2 [报告]
发表于 2004-08-11 09:15 |只看该作者

使用bcopy和bzero的疑问???

跟函数无关,看你自己的程序吧

论坛徽章:
0
3 [报告]
发表于 2004-08-11 09:33 |只看该作者

使用bcopy和bzero的疑问???

有这么 奇怪的?
把代码贴出来让大家瞧瞧,
好么?

论坛徽章:
0
4 [报告]
发表于 2004-08-11 14:14 |只看该作者

使用bcopy和bzero的疑问???

int main() {

int s, ns, len;         //sockets id
char messhead[10];       //message head
char *member;
char hostname[HOSTLEN];  

struct hostent  *hp;
struct sockaddr_in coaddr;
struct sockaddr_in praddr;

if ((s= socket(AF_INET, SOCK_STREAM, 0)) < 0) {
                perror("socket";
                exit(1);
                }


gethostname(hostname,sizeof(hostname));

if((hp = gethostbyname(hostname)) == NULL) {
        fprintf(stderr, "unknown host %s\n", hostname);
        exit(1);
}

bzero(&coaddr, sizeof(coaddr));
coaddr.sin_family      =  AF_INET;
coaddr.sin_port        =  htons(PORTA);
bcopy(hp->;h_addr, &coaddr.sin_addr, hp->;h_length);
len = sizeof(coaddr);

        if(bind(s, (struct sockaddr *) &coaddr, len) < 0) {
                perror("binding socket";
                exit(1);
                }

        if(listen(s, MAXMEMBERS) < 0) {
        perror("listen";
        exit(1);
        }

        while(1) {
                bzero(&praddr, sizeof(praddr));                   l             en = sizeof(praddr);
               
                if((ns = accept(s, (struct sockaddr *)   &praddr,     &len) ) < 0 )  {
                perror("accepting connection";
                exit(1);
                }

                if(fork() == 0) {                     //child process
               
                while(1) {
               
                for(i=0; i<=MAXLEN; i++) inbuf='\0';
                for(i=0; i<10; i++) messhead='\0';
                recv(ns, inbuf,MAXLEN,0);
                sscanf(inbuf, "%s", messhead);
                printf("receive: %s\n", messhead);
               
                if(strcmp(messhead,"MESS" == 0) {
                       
               
                }
               
                if(strcmp(messhead,"JOIN" == 0) {
                        //do join
                        sendback( ns);
                        sendadd();
                }
                       
                if(strcmp(messhead,"LEAVE" == 0) {
                        sendleave(ns);
                        printf("Leave finish!\n";
                        //close(ns);
                }
                 
               
                }
                }
                }
}       


int sendadd() {
struct sockaddr_in member;
struct hostent *nhp;
char gmname[MAXMEMBERS][HOSTLEN];
int  s;               //socket ID
char host[HOSTLEN];
int n=0;

//read member list from file
memberlist=fopen(filename, "r";
while((fgets(host, HOSTLEN, memberlist))!=NULL) {
        strcpy(gmname[n++], host);
}

fclose(memberlist);

//distributed add hostname to others
for(i=0; i<(n-1); i++) {
        printf("in distributed hostname function 1\n";

        bzero(nhp, sizeof(nhp));

        if((nhp=gethostbyname(gmname)) <0) {
                perror("unknown hostname");
                return(-1);
        }

        printf("in distributed hostname function 2\n");

        if((s = socket(AF_INET, SOCK_STREAM, 0))<0) {
        perror("sendchange");
        return(-1);
        }

        printf("in distributed hostname function 3\n");

        bzero(&member, sizeof(member));
        member.sin_family = AF_INET;
        member.sin_port = htons(PORTB);
        bcopy(nhp->;h_addr, &member.sin_addr, nhp->;h_length);

        printf("in distributed hostname function 4\n");

        if(connect(s, (struct sockaddr *) &member, sizeof(member)) <0) {
        perror("distribut IPs failed");
        return(-1);
        }

        printf("in distributed hostname function 5 \n");

        send(s, "ADD", MAXLEN, 0);

        printf("send add to client!\n");

        for(i=0; i<=MAXLEN; i++) outbuf='\0';
        strcpy(outbuf, gmname[n-1]);
        send(s, outbuf, MAXLEN, 0);
        close(s);
        }
        printf("function sendadd finish!\n");
        return(1);
}       

程序大体就是这个结构,还有函数我没有贴出来。为什么在mian函数里好好的, 在下面一个自定义函数就不行了?

论坛徽章:
0
5 [报告]
发表于 2004-08-11 17:17 |只看该作者

使用bcopy和bzero的疑问???

bzero (nhp, sizeof (nhp));   //???

if ((nhp = gethostbyname (gmname)) < 0)  //???

gethostbyname返回的是指针呀。

还有,你哪里证明停在  bcopy 或 bzero ,
你程序停在哪个 ?

论坛徽章:
0
6 [报告]
发表于 2004-08-11 19:55 |只看该作者

使用bcopy和bzero的疑问???

bzero(&member, sizeof(member));
此时你用的时member的地址(&member)
但是你定义的member却是:
char *member;
一个指针……
而sizeof(member)也就是sizeof(char *)
任何指针在32位的系统中都是32位的……
下面的同理
sizeof(nhp)
什么的都是没法用……
指针用之前要让它指个地方对不对?
另外,你可以写个程序,看看sizeof(char *)sizeof(int *)sizeof(void *)什么的都是多少。看看就明白了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP