⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkphone.c

📁 一款基于GTK的internet phone 程序。程序分为服务器端和客户端两部分。服务器端维护用户的IP
💻 C
📖 第 1 页 / 共 3 页
字号:
	 sprintf(txt,"%d.%d.%d.%d:%d",msg[0],msg[1],msg[2],msg[3],		 (msg[4]<<8)|msg[5]);	 sprintf(txt2,"%d.%d.%d.%d:%d",localaddr[0],localaddr[1],		 localaddr[2],localaddr[3],(localport[0]<<8)|localport[1]);	 printf("%-21s Local:%-21s: %s\n",txt,txt2,name);	 ChainInsert(userInfo,name,1);      }            if(!connected && tryingtocall && !strcmp(name,calling)) {	 if(!memcmp(publicaddr,myvisibleaddr,IPADDRSIZE)) {	    memcpy(&buddy.sin_addr.s_addr,localaddr,IPADDRSIZE);	    memcpy(&buddy.sin_port,localport,IPPORTSIZE);	 } else {	    memcpy(&buddy.sin_addr.s_addr,publicaddr,IPADDRSIZE);	    memcpy(&buddy.sin_port,publicport,IPPORTSIZE);	 }	 buddy.sin_family=AF_INET;	 talktries=0;	 /*	  * Add a timeout for sending a talk attempt	  * TALKTRYDELAY second timeout	  */	 gtk_timeout_add((TALKTRYDELAY * 1000), sendtalk, NULL);      }      break;    case CODE_SOUND:      if(!connected) {	 printf("got some sound...\n");	 if(talktries>=0 && 	    !memcmp(&from->sin_addr.s_addr,&buddy.sin_addr.s_addr,IPADDRSIZE) &&	    !memcmp(&from->sin_port,&buddy.sin_port,IPPORTSIZE)) {	    memcpy(&buddy,from,sizeof(buddy));	    answer();	 } else {	    mesg[0]=CODE_BYE;	    putmsg(from,mesg,1);	    break;	 }      }      if(size>3) {	 j=(msg[0]<<16) | (msg[1]<<8) | msg[2];	 msg+=3;	 k=(msg[0]<<24) | (msg[1]<<16) | (msg[2]<<8) | msg[3];	 msg+=4;	 lastdiff=gtime2()-k;	 k=(msg[0]<<24) | (msg[1]<<16) | (msg[2]<<8) | msg[3];	 msg+=4;	 latency=lastdiff+k;	 	 if(j>incount) {	    incount=j;	    for(i=0;i<PACKETSTOPACK;++i) {	       unpack33to160(sndblock2,msg+i*33);	       writein+=block160size;	       j=writelimit-writeput;	       if(j>block160size) j=block160size;	       memcpy(writeput,sndblock2,j);	       writeput+=j;	       if(writeput==writelimit) {		  writeput=writefifo;		  if(j<block160size) {		     memcpy(writeput,sndblock2+j,block160size-j);		     writeput+=block160size-j;		  }	       }	    }	 } else {	    printf("Got packet with id %d, I've received up to %d\n",j,incount);	 }      }      break;    case CODE_TALK:      if(connected) break;      mesg[1+MAXNAMESIZE]=0;      printf("Received TALK from %s\n",mesg+1);      gottalk=1;      memcpy(&buddy,from,sizeof(buddy));      if(havedsp) {	 chime();      } else {	 opendsp();	 chime();	 closedsp();      }      gtk_label_set_text(GTK_LABEL(popup_label),mesg+1);      if (GTK_WIDGET_VISIBLE (popup_dlg)) {      } else {	 gtk_widget_show(popup_dlg);      }      break;    case CODE_BYE:      if(!connected) break;      if(memcmp(&buddy.sin_addr.s_addr,&from->sin_addr.s_addr,IPADDRSIZE))	break;      if(memcmp(&buddy.sin_port,&from->sin_port,IPPORTSIZE)) break;      closedsp();      connected=0;      memset(&buddy,0,sizeof(buddy));      printf("Disconnected, received BYE\n");      break;    case CODE_NAME:      ChainInsert(userInfo,msg,0);      break;    case CODE_UNKNOWN:      printf("Received a CODE_UNKNOWN from the matcher, which means your\n");      printf("email address identity is unknown to the server. Check your\n");      printf(".phonerc file.\n");      break;    case CODE_EMPTY:      printf("--Empty list--\n");      printf("Your contact list is empty. Add names to your contact list\n");      printf("and get them to add your name to theirs.\n");      break;    case CODE_INVALID:      printf("Server claims your password is invalid. Check your .phonerc\n");      printf("file and make sure you put in the pass line from the email\n");      printf("you should have received.\n");      break;    case CODE_NOONE:      printf("No one in your contact list is online\n");      break;   }}int iswhite(int c){	return c==' ' || c=='\t' || c=='\n' || c=='\r';}void token(char *put,int len,char **take){	while(**take && iswhite(**take)) ++(*take);	while(**take && !iswhite(**take) && len>1)	{		*put++=*(*take)++;		--len;	}	*put=0;}void report(void) {   int t;      if(!havedsp || !connected) {      printf("Not connected to anyone\n");      return;   }   t=gtime2();   printf("%9ld: msec dsp open\n",t-dspopentime);   printf("%9ld: msec of sound data written to dsp\n",totalwritten>>3+1);   printf("%9ld: msec of sound data read from dsp\n",totalread>>3+1);   printf("%9ld: outcount\n",outcount);   printf("%9ld: incount\n",incount);   printf("%9ld: msec latency\n",latency);   printf("%9d: msec writein\n",writein>> (block160size==160 ? 3 : 4));}void dobye() {   if(!connected) return;   printf("Sending BYE packet.\n");   mesg[0]=CODE_BYE;   putmsg(&buddy,mesg,1);   memset(&buddy,0,sizeof(buddy));   connected=0;   if (GTK_WIDGET_VISIBLE (online_dlg)) {      gtk_widget_hide(online_dlg);   } else {   }   closedsp();}void processtyped(int com, char * data) {   char *resolved;   static char msg[20];      tryingtocall=0;   /*    * 1 - call    * 2 - who    * 3 - bye    * 4 - info    * 5 - alias    * 6 - quit    * 7 - answer    * 8 - add    * 9 - del    * 10 - list    */   switch (com) {    case 1:      if(connected) {	 printf("You're already connected. Use \"bye\" to disconnect.\n");      } else {	 tryingtocall=1;	 resolved=findalias(data);	 if(!resolved) resolved=data;	 printf("Trying to call %s\n",resolved);	 strcpy(calling,resolved);	 msg[0]=CODE_CALL;	 computehash(msg+1,resolved);	 messagetoserver(msg,9);      }      break;    case 2:      msg[0]=CODE_WHO;      messagetoserver(msg,1);      break;    case 3:      if(!connected) {	 printf("You're not connected.\n");      } else {	 dobye();      }      break;    case 4:      report();		      break;    case 5:      listaliases();      break;    case 6:      dobye();      unregisterme();      exitflag=1;      break;    case 7:      if(gottalk) {	 answer();      } else {	 printf("You haven't received a TALK request.\n");      }      break;    case 8:      resolved=findalias(data);      if(!resolved) resolved=data;      printf("Trying to add %s\n",resolved);      msg[0]=CODE_ADD;      computehash(msg+1,resolved);      messagetoserver(msg,9);      break;    case 9:      resolved=findalias(data);      if(!resolved) resolved=data;      printf("Trying to remove %s\n",resolved);      msg[0]=CODE_REMOVE;      computehash(msg+1,resolved);      messagetoserver(msg,9);      break;    case 10:      msg[0]=CODE_LIST;      messagetoserver(msg,1);      break;    default:      printf("Commands:\n");      printf("add <username>     = add user to your contact list\n");      printf("alias              = list aliases\n");      printf("answer             = answer a TALK request\n");      printf("bye                = disconnect call\n");      printf("call <username>    = make call\n");      printf("del <username>     = remove user from your contact list\n");      printf("info               = print out some statistics\n");      printf("list               = printout contact list\n");      printf("quit               = quit out of program\n");      printf("who                = query server for who in your contact list is online\n");      printf("---\n");      break;   }}#define THRESHOLD (8<<8)int checkloud(unsigned char *p){int i,j,max,min;	i=160;	max=-5000;	min=5000;	while(i--)	{		j=*p++;		j|=*p++<<8;		if(j>=0x8000) j-=0x10000;		if(j<min) min=j;		if(j>max) max=j;	}	if(max-min>THRESHOLD) return 1;	return 0;}void cchandler(int num){	signal(SIGINT,SIG_IGN);}#define VOL 0x20chime() {   unsigned char buff[1024];   int i;   if(!havedsp) return;   if(block160size==160)     {	for(i=0;i<160;++i)	  if(i%40<20) buff[i]=0x80-VOL;	else buff[i]=0x80+VOL;     } else     {	for(i=0;i<160;++i)	  if(i%40<20) buff[i+i]=0,buff[i+i+1]=-VOL;	else buff[i+i]=0,buff[i+i+1]=VOL;     }   for(i=0;i<8;++i)     write(sndin,buff,block160size);}gint addToList(GtkWidget *widget, gpointer data) {   GtkWidget * entry = data;   char * text;   text = gtk_entry_get_text(GTK_ENTRY(entry));   processtyped(8,text);   gtk_timeout_add(500,updateList,NULL);   return FALSE;}gint delFromList(GtkWidget *widget, gpointer data) {   GtkWidget * entry = data;   char * text;   text = gtk_entry_get_text(GTK_ENTRY(entry));   processtyped(9,text);   gtk_entry_set_text(GTK_ENTRY(entry),"");   gtk_timeout_add(500,updateList,NULL);   return FALSE;}gint acceptTypedData(GtkWidget *widget, gpointer data) {   GtkWidget * entry = data;   char * text;   int len;   text = gtk_entry_get_text(GTK_ENTRY(entry));   processtyped(1,text);   gtk_entry_set_text(GTK_ENTRY(entry),"");   return FALSE;}void addressBookEntrySelected( GtkWidget      *clist,			      gint            row,			      gint            column,			      GdkEventButton *event,			      gpointer        data ) {   gchar *text;   GtkWidget * entry = data;   gtk_clist_get_text(GTK_CLIST(clist), row, 1, &text);   gtk_entry_set_text(GTK_ENTRY(entry),text);   return;}GtkWidget* create_online_popup (void) {   GtkWidget *window2;   GtkWidget *frame2;  GtkWidget *vbox2;  GtkWidget *label3;  GtkWidget *label4;  GtkWidget *hseparator2;  GtkWidget *hbox2;  GtkWidget *button3;  window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);  gtk_object_set_data (GTK_OBJECT (window2), "window2", window2);  gtk_window_set_title (GTK_WINDOW (window2), _("window2"));  gtk_window_set_policy (GTK_WINDOW (window2), TRUE, FALSE, TRUE);  frame2 = gtk_frame_new (NULL);  gtk_widget_ref (frame2);  gtk_object_set_data_full (GTK_OBJECT (window2), "frame2", frame2,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (frame2);  gtk_container_add (GTK_CONTAINER (window2), frame2);  vbox2 = gtk_vbox_new (FALSE, 0);  gtk_widget_ref (vbox2);  gtk_object_set_data_full (GTK_OBJECT (window2), "vbox2", vbox2,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (vbox2);  gtk_container_add (GTK_CONTAINER (frame2), vbox2);  gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);  label3 = gtk_label_new (_("Talk in progress"));  gtk_widget_ref (label3);  gtk_object_set_data_full (GTK_OBJECT (window2), "label3", label3,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (label3);  gtk_box_pack_start (GTK_BOX (vbox2), label3, FALSE, FALSE, 0);  label4 = gtk_label_new (_("Press button to End."));  gtk_widget_ref (label4);  gtk_object_set_data_full (GTK_OBJECT (window2), "label4", label4,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (label4);  gtk_box_pack_start (GTK_BOX (vbox2), label4, FALSE, FALSE, 3);  hseparator2 = gtk_hseparator_new ();  gtk_widget_ref (hseparator2);  gtk_object_set_data_full (GTK_OBJECT (window2), "hseparator2", hseparator2,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (hseparator2);  gtk_box_pack_start (GTK_BOX (vbox2), hseparator2, FALSE, FALSE, 3);  hbox2 = gtk_hbox_new (TRUE, 8);  gtk_widget_ref (hbox2);  gtk_object_set_data_full (GTK_OBJECT (window2), "hbox2", hbox2,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (hbox2);  gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, TRUE, 0);  gtk_container_set_border_width (GTK_CONTAINER (hbox2), 3);  button3 = gtk_button_new_with_label (_("End Talk"));  gtk_widget_ref (button3);  gtk_object_set_data_full (GTK_OBJECT (window2), "button3", button3,                            (GtkDestroyNotify) gtk_widget_unref);  gtk_widget_show (button3);  gtk_box_pack_start (GTK_BOX (hbox2), button3, FALSE, FALSE, 0);   gtk_signal_connect(GTK_OBJECT(button3), "clicked",		      GTK_SIGNAL_FUNC(buttonEndConversation),		      NULL);     return window2;}GtkWidget* create_incoming_popup (void) {   GtkWidget *window1;   GtkWidget *vbox1;   GtkWidget *label1;   GtkWidget *label2;   GtkWidget *hseparator1;   GtkWidget *hbox1;   GtkWidget *frame1;   GtkWidget *button1;   GtkWidget *button2;   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -