首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

bind出有关问题

2012-03-16 
bind出问题,求助我的系统是linux,从书本中获取两个GTK程序,用c来写的,基本上相同,一个正常,另外一个总是bi

bind出问题,求助
我的系统是linux,从书本中获取两个GTK程序,用c来写的,基本上相同,一个正常,另外一个总是bind出问题请教了:
第一个是正常的,代码如下:

C/C++ code
/* 服务器端 echo_server */#include <glib.h>#include <stdio.h>#include <fcntl.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h>//定义端口号#define OURPORT 8088//当有用户连接时的服务子进程voiddo_service(gint sd){gchar buf[1024];while(read(sd,buf,1024) != -1) //从用户读取数据{write(sd,buf,1024);//向用户发送数据}}int main(int argc, char* argv[]){gint sd, newsd; //定义套接字句柄struct sockaddr_in *sin;//套接字地址结构gint slen;gchar buf[1024];sd = socket(AF_INET,SOCK_STREAM,0);//创建套接字if(sd == -1){g_print("create socket error!\n");//创建时出错return -1;}sin = g_new(struct sockaddr_in,1);//为套接字地址分配内存sin->sin_family = AF_INET; //套接字类型sin->sin_port = OURPORT;//端口slen = sizeof(struct sockaddr_in);if(bind(sd,(struct sockaddr *)sin,slen)<0) //向指定端口绑定{g_print("bind error!\n");//绑定时出错return -1;}if(listen(sd,8)<0) //监听{g_print("listen error!\n");//监听出错return -1;}for(;;) //死循环,等侍用户连接{newsd = accept(sd,(struct sockaddr *)sin,&slen);//取得用户连接的套接字if(newsd == -1){g_print("accept error!\n");//连接出错break;}switch(fork()) //产生子进程{case 0:do_service(newsd);//执行服务break;case -1:g_print("fork error! \n");//产生子进程时出错break;}}close(sd); //关闭套接字g_free(sin);//释放内存}


而下面一个基本上是一样的,但总是在bind那句过不了,不是程序语法问题,而是bind的结果总是为-1
代码如下:
C/C++ code
/* 服务器端 server.c */#include <glib.h>#include <stdio.h>#include <fcntl.h>#include <signal.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/time.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h>#define OURPORT 8088#define MAX_USERS 8//定义用户数据结构struct _client {gint sd;gboolean in_use;gchar name[64];gchar buf[1024];};typedef struct _client client;//定义用户数据区client user[MAX_USERS];//定义服务线程voiddo_service (gpointer id){gint j;char tobuf[1024];while(read(user[GPOINTER_TO_INT(id)].sd,user[GPOINTER_TO_INT(id)].buf,1024)!=-1){sprintf(tobuf,"%s:%s\n",user[GPOINTER_TO_INT(id)].name,user[GPOINTER_TO_INT(id)].buf);for(j=0; j<MAX_USERS; j++){if(user[j].in_use){write(user[j].sd,tobuf,1024);g_print("%s",tobuf);}}}user[GPOINTER_TO_INT(id)].in_use = FALSE;close(user[GPOINTER_TO_INT(id)].sd);//exit(0);}int main(int argc, char* argv[]){gint sd, newsd;struct sockaddr_in *sin;gint slen;gint count = 0;gint flags;gchar buf[1024];gchar tobuf[1024];gint length,i,j;if(!g_thread_supported())g_thread_init(NULL);elseg_print("thread not supported\n");sd = socket(AF_INET,SOCK_STREAM,0);if(sd == -1){g_print("create socket error!\n");return -1;}sin = g_new(struct sockaddr_in,1);sin->sin_family = AF_INET;sin->sin_port = OURPORT;slen = sizeof(struct sockaddr_in);if(bind(sd,(struct sockaddr *)sin,slen)==-1){g_print("bind error!\n");return -1;}if(listen(sd,8)<0){g_print("listen error!\n");return -1;}for(i=0; i<MAX_USERS; i++)user[i].in_use = FALSE;flags = fcntl(sd,F_GETFL);fcntl(sd,F_SETFL,flags&~O_NDELAY);for(;;){newsd = accept(sd,(struct sockaddr *)sin,&slen);if(newsd == -1){g_print("accept error!\n");break;}else{if(count >= MAX_USERS){sprintf(buf,"用户数量过多服务器不能连接。\n");write(newsd,buf,1024);close(newsd);}else{flags = fcntl(user[i].sd,F_GETFL);fcntl(user[i].sd,F_SETFL,O_NONBLOCK);user[count].sd = newsd;user[count].in_use = TRUE;read(newsd,user[count].name,64);//创建为用户服务的线程g_thread_create((GThreadFunc)do_service,(gpointer)count,TRUE,NULL);count++;}}}//for(;;)close(sd);g_free(sin);} 


为什么?

[解决办法]
有两个问题
1. sin = g_new(struct sockaddr_in,1);//为套接字地址分配内存
之后需要加
memset(sin, 0, sizeof(struct sockaddr_in));

2. sin->sin_addr没有赋值:
sin->sin_addr.s_addr = htonl(INADDR_ANY);

热点排行