Chinaunix

标题: 使用bcopy和bzero的疑问??? [打印本页]

作者: polobo    时间: 2004-08-11 04:54
标题: 使用bcopy和bzero的疑问???
为什么使用bcopy和bzero两个函数的时候,有时候程序运行到那里会莫名其妙的停在那里? 这种情况好象在main函数中不会出现, 但如果是我自己定义的函数中调用这两个函数就会有问题。

希望各位大虾指点迷津!
作者: FH    时间: 2004-08-11 09:15
标题: 使用bcopy和bzero的疑问???
跟函数无关,看你自己的程序吧
作者: A0110A    时间: 2004-08-11 09:33
标题: 使用bcopy和bzero的疑问???
有这么 奇怪的?
把代码贴出来让大家瞧瞧,
好么?
作者: polobo    时间: 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函数里好好的, 在下面一个自定义函数就不行了?
作者: A0110A    时间: 2004-08-11 17:17
标题: 使用bcopy和bzero的疑问???
bzero (nhp, sizeof (nhp));   //???

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

gethostbyname返回的是指针呀。

还有,你哪里证明停在  bcopy 或 bzero ,
你程序停在哪个 ?
作者: 默难    时间: 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 *)什么的都是多少。看看就明白了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2