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