usr/ vm_client
附錄 附錄 附錄
附錄 D 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構 目錄與檔案結構
vmc.sh autowl
bin/ nano-X
nanowm nxkbd proc/ (ram)
tmp/ (ram)
var/ (ram)
未來若有更新將可從以下網址取得。
內容列表:
http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_list.doc
Root File System(xhyper255B):
http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_xhyper255b.tar.bz2
Root File System(x86):
http://bbs.iecs.fcu.edu.tw/~ianstar/linux/94a/rootfs_x86.tar.bz2
1 /* vm_client_net.c -*/
2
3 #include <pthread.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include "vm_client.h"
7 #include <arpa/inet.h>
8 #include <netdb.h>
9 10
11 #define LINELEN 256
12 extern int Answer;
13 extern int Invite;
14 extern int Invited;
15 extern int Leave; /*1=leave action 2=leaving a message 3=geting message from server*/
16 extern int Cancel_voip_able; /*1=set can cancel voip */
17 extern int Next_message; /*use to play next message*/
18 extern int errno;
19 extern char *Host,*Service;
20
21 char Myname[20];
22
23 pthread_t Voip_thread_send,Voip_thread_receive,Receive_thread;
24 int Server_socket; /*server socket*/
25 int Address; /*to save another client's address*/
26 int Voip_port;
27 int Voip_socket;
28 short int IP_send; /*tell server ,ip had send*/
29 short int Get_ip; /*to client that server had got ip*/
30 short int prepare_voip;
31 struct sockaddr_in SIN;/* an Internet endpoint address */
32
33 int audio_init();
34 int audio_exit();
35 int rec(unsigned char *data, int size);
36 int play(unsigned char *data,int size);
37 int connectTCP(const char *host,const char *service);
38 int connectUDP(const char *host,const char *service);
39 int passiveUDP(const char *service);
40 int Send_Command(char *mgs );
41 void *start_voip(void *arg);
42 void *voip_send(void *arg);
43 void *voip_receive(void *arg);
44 void *receive_message(void *arg);/*get message(commamd) from server*/
45 void *leave_message(void *arg);
46 void *get_message(void *arg); /*get voice message*/
47 void *send_still_alive(void *);
48 void cancel_thread(pthread_t);
49 void get_address(void); /*get udp address and port*/
50 void cancel_voip(short int);
51 void cancel_leave_message(short int);
52 void play_message_file(void);/*play voice message file*/
53
54 int check_list(int mode,char *id);
55 void set_list(char *);
56 void add_list(int mode,char *id); /*mode 1= Online_list 2=Offline_list*/
57 void remove_list(int mode,char *id);/*mode 1= Online_list 2=Offline_list*/
58 void reflash_list(void);
59 void back_to_login(void); /*back to login windows*/
60 int check_friend(char *);/*check is your friend?*/
61 int add_friend(char *string);
62 void logout(short int);
63 void show_invite_window(char *);
64 void show_warning_message(char *string,int mode);
65 void close_warning_message(void);
66 int errexit(const char *format, ...);
67
68 /*---
69 * Connect_server - connect to server,send name and password
70 *---
71 */
72 int Connect_server(const char *host, const char *service,char
*account,char *password,int mode)
73 {
74 char temp[50],buf[LINELEN+1];
75 int res,count; /* socket descriptor, read count*/
76
77 Server_socket = connectTCP(host, service);/*connect server*/
78
86 sprintf(temp,"%s %s",account,password);
87
93 count=read(Server_socket, buf, LINELEN);
附錄 附錄 附錄
附錄 E Voice
Messenger v1.0 程式碼程式碼程式碼程式碼94 buf[count]='\0';
102 res=pthread_create(&Receive_thread, NULL, receive_message,(void
*)Server_socket);
103 if(res != 0)
104 {
105 printf("Thread create failed!!!\n");
106 exit(1);
114 * receive_message - get message or get ip address from server
115 *---
116 */
117 void *receive_message(void *arg)
118 {
119 char buf[LINELEN+1],temp[50],*tok;
120 int count,res,sock;
121 struct in_addr add;
122 pthread_t start_thread;
123 pthread_t still_alive;
124
125 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
126 if(res != 0)
127 {printf("Thread setcancelstste failed!!!\n");
128 exit(1);
129 }
130
131 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
132 if(res != 0)
133 {printf("Thread setcanceltype failed!!!\n");
134 exit(1);
145 puts(buf);/*show string "#list"*/
146
156 pthread_create(&still_alive, NULL,send_still_alive ,NULL);
157
168 show_warning_message("Server down!!!",1);
169 logout(0);/*server down mode */
195 reflash_list();
203 sprintf(temp,"%s invite you to talk,would like it?",tok);
204
228 pthread_create(&start_thread, NULL,start_voip ,NULL);
229 }
230 /*anthoer client not accept your invition*/
231 else if(strcmp(buf,"#accept")!=0 && Invite==1 && (!prepare_voip) )
238 else if(strcmp(buf,"#get_v_message")==0)
239 {
261 else if(strcmp(buf,"#stop_voip")==0 && Cancel_voip_able)
262 cancel_voip(1);
288 else if(strcmp(buf,"#get_message")==0)
289 {
290 show_invite_window("get message,would you like to get
it?");
291 Leave=3;
305 * send_still_alive - let server know you still online(alive)
306 *---
307 */
308 void *send_still_alive(void *arg)
309 {
310 int state=1;
311
312 while(state)
313 {
314 state=Send_Command("#still_alive");
315 sleep(60);
325 void set_list(char *input)
326 {
327 FILE *fp;
328 char buf[256],temp[50];
329 char *tok;
330
331 if(access("friend",R_OK)==0)
332 {
333 fp=fopen("friend","r");
334 while(fgets(buf,256,fp))
335 {
336 sscanf(buf,"%s\n",temp);
337 if(((check_list(2,temp))==-1) && ((check_list(1,temp))==-1))
338 {
369 int check_friend(char *list)
370 {
371 FILE *fp;
372 char buf[256],temp[50];
373 int count=0;
374
375 if(access("friend",R_OK)==0)
376 {
392 return 1;
402 int add_friend(char *string)
403 {
404 FILE *fp;
405 char buf[LINELEN+1];
406 strcpy(buf,string);
407
421 * Send_Command - send command(message) to server
422 *---
423 */
424 int Send_Command(char *mgs )
425 {
444 void *start_voip(void *arg)
445 {
451 pthread_create(&Voip_thread_send, NULL,voip_send ,NULL);
452 pthread_create(&Voip_thread_receive, NULL,voip_receive ,NULL);
453
454 Cancel_voip_able=1;
455 show_warning_message("Talking...",2);
456
463 void get_address(void)
464 {
465 char *service = "7777"; /* default service name */
466 struct hostent *phe;/* pointer to host information entry */
467 struct sockaddr_in sin; * an Internet endpoint address */
468 char buf[50];
469
470 /*connect server*/
471 Voip_socket = socket(AF_INET ,SOCK_DGRAM ,0);
472 sin.sin_family = AF_INET ;
473 sin.sin_port = htons((u_short)atoi(service));
474
475 if ( (phe = gethostbyname(Host)) )
476 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
477 else if ( (sin.sin_addr.s_addr = inet_addr(Host)) == INADDR_NONE )
478 errexit("can't get \"%s\" host entry\n", Host);
479
480 /*send message to server,so server can get NAT's ip and port*/
481 sprintf(buf,"%s",Myname);
482 printf("sending...\n");
483
484 while(1)
485 {
486 sendto(Voip_socket,buf, sizeof(buf), 0, (struct sockaddr *)&sin, sizeof(sin));
493 puts("waiting for ip");
500 printf("Start VOIP\n");
501
508 void *voip_send(void *arg)
509 {
510 unsigned char buf[BUFSIZE];
511 int res;
512
513 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
514 if(res != 0)
515 {printf("Thread setcancelstste failed!!!\n");
516 exit(1);
517 }
518
519 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
520 if(res != 0)
521 {printf("Thread setcanceltype failed!!!\n");
522 exit(1);
523 }
524
525 SIN.sin_addr.s_addr=htonl(Address);/*covert to network address
format*/
526 SIN.sin_port=htons(Voip_port);
527
528 while(1)
529 {rec(buf, BUFSIZE);
530 sendto(Voip_socket, buf, sizeof(buf), 0, (struct sockaddr *)&SIN, sizeof(SIN));
541 void *voip_receive(void *arg)
542 {
547 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
548 if(res != 0)
549 {printf("Thread setcancelstste failed!!!\n");
550 exit(1);
551 }
552
553 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
554 if(res != 0)
555 {printf("Thread setcanceltype failed!!!\n");
556 exit(1);
563 n=recvfrom(Voip_socket, buf, sizeof(buf), 0, (struct sockaddr *)&SIN, &alen);
575 void *leave_message(void *arg)
576 {
577 unsigned char buf[BUFSIZE];
578 char *service = "9855";
579 int res;
580
581 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
582 if(res != 0)
583 {printf("Thread setcancelstste failed!!!\n");
584 exit(1);
585 }
586
587 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
588 if(res != 0)
589 {printf("Thread setcanceltype failed!!!\n");
590 exit(1);
591 }
592
593 audio_init();
594
595 Voip_socket=connectUDP(Host,service);
596
610 void *get_message(void *arg)
611 {
612 char *service = "8885"; /* default service name */
613 struct hostent *phe;/* pointer to host information entry */
614 struct sockaddr_in sin; /* an Internet endpoint address */
615 unsigned char buf[BUFSIZE];
616 char temp[100],me[50],size[50];
617 int alen,sock,n,sum;
618 FILE *fp;
619
620 /*connect server*/
621 sock = socket(AF_INET ,SOCK_DGRAM ,0);
622 sin.sin_family = AF_INET ;
623 sin.sin_port = htons((u_short)atoi(service));
624
625 if ( (phe = gethostbyname(Host)) )
626 memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
627 else if ( (sin.sin_addr.s_addr = inet_addr(Host)) == INADDR_NONE )
628 errexit("can't get \"%s\" host entry\n", Host);
629
630 /*send message to server,so server can get NAT's ip and port*/
631 sprintf(temp,"%s",Myname);
632 printf("sending...\n");
633
634 while(1)
635 {
636 sendto(sock,temp, sizeof(temp), 0, (struct sockaddr *)&sin, sizeof(sin));
645 printf("get message\n");
646 n=recvfrom(sock,temp, sizeof(temp), 0, (struct sockaddr
*)&sin,&alen);
647 temp[n]='\0';
648
649 show_warning_message("Downloading...",3);
650
651 while(strcmp(temp,"#end")!=0)
652 {
658 fp=fopen("messagelog","a");
659 fprintf(fp,"%s %s\n",me,size);
660 fclose(fp);
661
662 sum=0;
663
664 fp=fopen(me,"a");/*get message*/
665 while(strcmp(buf,"#message end")!=0 || (sum-BUFSIZE)== atoi(size))
666 {
681 close_warning_message();
682 puts("download ok");
683 show_warning_message("download complete!!",1);
684
685 close(sock);
686
687 play_message_file();
688
689 pthread_exit(NULL);
690 }
691 /*---
692 * play_message_file - message file from disk
693 *---
694 */
695 void play_message_file(void)
696 {
697 unsigned char buf[BUFSIZE];
698 char temp[50],filename[50],size[50];
699 int sleeptime,bps;
705 fplog=fopen("messagelog","r");
706
707 while(fgets(temp,256,fplog))
708 {
709 sscanf(temp,"%s %s\n",filename,size);
710
711 close_warning_message();
712 show_warning_message(filename,3);
713
722 sleeptime= atoi(size)/bps;/*wait for sound I/O complete*/
723 printf("Sleep time : %d\n",sleeptime);
724 usleep(1000000*sleeptime);
725
726 close_warning_message();
727 show_warning_message("Next message",1);
728
742 remove("messagelog");
743
744 Leave=0;
745 close_warning_message();
746 show_warning_message("No next message",1);
747
755 void cancel_thread(pthread_t thread)
756 {
757 int res;
758 res=pthread_cancel(thread);
759 if(res != 0)
770 void cancel_voip(short int mode)
771 {
772 /*stop voip*/
773 if(mode)
774 Send_Command("#stop_voip");
775
776 close_warning_message();
777 show_warning_message("Stop talking",1);
778
779 cancel_thread(Voip_thread_send);
780 cancel_thread(Voip_thread_receive);
781 audio_exit();
790 /*---
791 * cancel_leave_message
792 *---
793 */
794 void cancel_leave_message(short int mode)
795 {
796 /*stop leave a message*/
797 if(mode)
798 Send_Command("#stop_leave_message");
799
800 close_warning_message();
801 show_warning_message("Stop leave a message",1);
802
803 cancel_thread(Voip_thread_send);
804 audio_exit();
805 Leave=0;
806 close(Voip_socket);
807 printf("message socket stop\n");
808
815 void logout(short int mode )
816 {
817 if(Cancel_voip_able)
818 cancel_voip(mode);
824 Send_Command("#bye");
825
826 cancel_thread(Receive_thread);
827
828 close(Server_socket);
829
2 #include "nxcolors.h"
3 #include "vm_client.h"
4 #include <signal.h>
5
6 GR_WINDOW_ID Tablew;
7 GR_WINDOW_ID Loginw, EnterAw, EnterPw, Addw, EnterCw, Addbw;
8 GR_WINDOW_ID Loginbw, Tool1w, Tool2w, Tool3w, Listw, Onlinew,
Offlinew;
9 GR_WINDOW_ID AddbAw, AddbMw, ViewIMw, ViewIMbw, Invitew, InvitebYw, InvitebNw;
10 GR_WINDOW_ID PCMw, PCMupbw, PCMdownbw, MICw, MICupbw, MICdownbw;
11 GR_GC_ID Gc, Gck, Gcw, Gcg;
12 GR_EVENT Event;
13 GR_COORD Begxpos;
14 GR_COORD Xpos, Xposp;
15 GR_COORD Ypos;
16 GR_IMAGE_INFO Table_skin_info, Login_skin_info, List_skin_info;
17 GR_IMAGE_ID Table_skin_id, Login_skin_id, List_skin_id;
18
19 Member_list Online_list[Maxlist], Offline_list[Maxlist];
20
31 int Next_message;
32 char *Host, *Service;
33
34 int Connect_server(const char *host, const char *service,char
*account,char *password,int mode);
35 void init_windows(void);
36 void do_keystroke(GR_EVENT_KEYSTROKE *kp);
37 void do_exposure(GR_EVENT_EXPOSURE *ep);
38 void do_buttondown(GR_EVENT_BUTTON *bp);
39 void do_buttonup(GR_EVENT_BUTTON *bp);
40 void show_warning_message(char *string,int mode);
41 int add_friend(char *string);
42 void back_to_login(void);
43
44 void Clean_windows(GR_WINDOW_ID wid);
45 void show_invite_window(char *);
46 void close_warning_message(void);
47 int check_list(int mode,char *id);
48 void add_list(int mode,char *id); /*mode 1= Online_list
2=Offline_list*/
49 void remove_list(int mode,char *id);/*mode 1= Online_list
2=Offline_list*/
50 void clean_list(void);
51 void reflash_list(void);
52 void Send_Command(char *mgs );
53 void reflash_sound_state(int p,int m);
54 void cancel_voip(short int);
55 void cancel_leave_message(short int);
56 void logout(short int);
57
63 int main(int argc, char *argv[])
64 {
78 fprintf(stderr, "usage: voipclient [host [port]]\n");
79 exit(1);
86 GrGetNextEvent(&Event);
87 switch(Event.type)
88 {
89 case GR_EVENT_TYPE_EXPOSURE :
90 do_exposure(&Event.exposure);
91 break;
92 case GR_EVENT_TYPE_BUTTON_DOWN :
93 do_buttondown(&Event.button);
94 break;
95 case GR_EVENT_TYPE_BUTTON_UP :
96 do_buttonup(&Event.button);
97 break;
98 case GR_EVENT_TYPE_MOUSE_POSITION :
99 break;
100 case GR_EVENT_TYPE_KEY_DOWN :
101 do_keystroke(&Event.keystroke);
102 break;
113 * init_windows - init microwindows
114 *---
115 */
116 void init_windows(void)
117 {
128 GrSetGCUseBackground(Gc, GR_FALSE);
129 GrSetGCForeground(Gc, GR_COLOR_BLACK);
130 GrSetGCForeground(Gck, GR_COLOR_BLACK);
131 GrSetGCBackground(Gck, GR_COLOR_WHITE);
132 GrSetGCForeground(Gcw, GR_COLOR_WHITE);
133 GrSetGCBackground(Gcw, GR_COLOR_WHITE);
134 GrSetGCForeground(Gcg, GR_COLOR_SLATEBLUE);
135
136 /*load Image*/
137 Table_skin_id=GrLoadImageFromFile("./skin/table.gif", 0);
138 GrGetImageInfo( Table_skin_id, &Table_skin_info);
139
140 Login_skin_id=GrLoadImageFromFile("./skin/login.gif", 0);
141 GrGetImageInfo( Login_skin_id, &Login_skin_info);
142
143 List_skin_id=GrLoadImageFromFile("./skin/list.gif", 0);
144 GrGetImageInfo( List_skin_id, &List_skin_info);
145
146 /*create table window*/
147 Tablew = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE
148 | GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 0, 0, 640, 480,
149 GR_COLOR_LIGHTSKYBLUE);
150
151 /*create tool button*/
152 Tool1w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |
153 GR_WM_PROPS_NODECORATE , NULL,GR_ROOT_WINDOW_ID, 60, 0, 60, 30,
154 GR_COLOR_WHITE);
155
156 Tool2w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |
157 GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 60, 0, 60, 30,
158 GR_COLOR_WHITE);
159
160 Tool3w =GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |
161 GR_WM_PROPS_NODECORATE, NULL,GR_ROOT_WINDOW_ID, 125, 0, 60, 30,
162 GR_COLOR_WHITE);
163
164 /*create list window*/
165 Listw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE
166 | GR_WM_PROPS_NODECORATE, "List", GR_ROOT_WINDOW_ID, 60, 30, 250,
167 300,GR_COLOR_WHITE);
168
169 Offlinew = GrNewWindow(Listw, 14, 25, 102, 160, 2, GR_COLOR_PINK,
170 GR_COLOR_RED);
171 Offline_list[0].Wid = GrNewWindow(Offlinew, 10, 10, 80, 20, 0,
GR_COLOR_GREY, 0);
172 Offline_list[1].Wid = GrNewWindow(Offlinew, 10, 40, 80, 20, 0,
GR_COLOR_GREY, 0);
173 Offline_list[2].Wid = GrNewWindow(Offlinew, 10, 70, 80, 20, 0,
GR_COLOR_GREY, 0);
174 Offline_list[3].Wid = GrNewWindow(Offlinew, 10, 100, 80, 20, 0,
GR_COLOR_GREY, 0);
175 Offline_list[4].Wid = GrNewWindow(Offlinew, 10, 130, 80, 20, 0,
GR_COLOR_GREY, 0);
176
177 Onlinew = GrNewWindow(Listw, 132, 25, 102, 160, 2, GR_COLOR_LIGHTSTEELBLUE, GR_COLOR_BLUE);
178 Online_list[0].Wid = GrNewWindow(Onlinew, 10, 10, 80, 20, 0,
GR_COLOR_GREY, 0);
179 Online_list[1].Wid = GrNewWindow(Onlinew, 10, 40, 80, 20, 0,
GR_COLOR_GREY, 0);
180 Online_list[2].Wid = GrNewWindow(Onlinew, 10, 70, 80, 20, 0,
GR_COLOR_GREY, 0);
181 Online_list[3].Wid = GrNewWindow(Onlinew, 10, 100, 80, 20, 0,
GR_COLOR_GREY, 0);
182 Online_list[4].Wid = GrNewWindow(Onlinew, 10, 130, 80, 20, 0,
GR_COLOR_GREY, 0);
183
184 AddbMw = GrNewWindow(Listw, 160, 260, 80, 25, 0, GR_COLOR_ORANGE2,
0);
185
186 PCMw = GrNewWindow(Listw, 36, 220, 70, 15, 0, GR_COLOR_WHITE, 0);
187 PCMdownbw = GrNewWindow(Listw, 21, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,
0);
188 PCMupbw = GrNewWindow(Listw, 93, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,
0);
189
190 MICw = GrNewWindow(Listw, 155, 220, 70, 15, 0, GR_COLOR_WHITE, 0);
191 MICdownbw = GrNewWindow(Listw, 140, 220, 15, 15, 0,
GR_COLOR_SLATEBLUE, 0);
192 MICupbw = GrNewWindow(Listw, 211, 220, 15, 15, 0, GR_COLOR_SLATEBLUE,
0);
193
194 /*create login window*/
195 Loginw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE
196 | GR_WM_PROPS_NODECORATE, "Login", GR_ROOT_WINDOW_ID, 60, 30, 250, 300,GR_COLOR_WHITE);
197
198 Loginbw = GrNewWindow(Loginw,100, 170, 60, 30, 0,
GR_COLOR_LIGHTSALMON, 0);
199 AddbAw = GrNewWindow(Loginw, 159, 260, 80, 25, 0, GR_COLOR_MEDIUMSEAGREEN, 0);
200
201 EnterAw = GrNewWindow(Loginw, 120, 70, 100, 15, 2, GR_COLOR_WHITE,
GR_COLOR_BLACK);
202 EnterPw = GrNewWindow(Loginw, 120, 110, 100, 15, 2, GR_COLOR_WHITE,
GR_COLOR_BLACK);
203
204 /*create IM window*/
205 ViewIMw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE
206 | GR_WM_PROPS_NODECORATE, "View", GR_ROOT_WINDOW_ID, 320,100 , 250,
207 90, GR_COLOR_LIGHTSTEELBLUE);
208
209 ViewIMbw = GrNewWindow(ViewIMw, 175, 45, 60, 30, 0, GR_COLOR_GRAY,
0);
210
211 /*create Add_Member window*/
212 Addw = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE |
213 GR_WM_PROPS_NODECORATE, "Add", GR_ROOT_WINDOW_ID, 320, 5, 250, 90,
214 GR_COLOR_LIGHTSTEELBLUE);
215
216 EnterCw = GrNewWindow(Addw, 90, 19, 100, 15, 2, GR_COLOR_WHITE,
GR_COLOR_BLACK);
217
218 Addbw = GrNewWindow(Addw, 175, 45, 60, 30, 0, GR_COLOR_GRAY, 0);
219
220 /*create Invite window*/
221 Invitew = GrNewWindowEx(GR_WM_PROPS_NOAUTOMOVE | GR_WM_PROPS_NOMOVE
222 | GR_WM_PROPS_NODECORATE , "Invitew", GR_ROOT_WINDOW_ID, 320, 100,
223 250,90, GR_COLOR_LIGHTSTEELBLUE);
224
225 InvitebYw = GrNewWindow(Invitew, 110, 45, 60, 30, 0, GR_COLOR_GRAY, 0);
226 InvitebNw = GrNewWindow(Invitew, 175, 45, 60, 30, 0, GR_COLOR_GRAY, 0);
227
228
229 /*select events for every windows*/
230 GrSelectEvents(Tablew, GR_EVENT_MASK_EXPOSURE );
231 GrSelectEvents(Loginw, GR_EVENT_MASK_EXPOSURE );
232 GrSelectEvents(Listw, GR_EVENT_MASK_EXPOSURE );
233 GrSelectEvents(Offlinew, GR_EVENT_MASK_EXPOSURE );
234 GrSelectEvents(Onlinew, GR_EVENT_MASK_EXPOSURE );
235 GrSelectEvents(ViewIMw, GR_EVENT_MASK_EXPOSURE );
236 GrSelectEvents(Addw, GR_EVENT_MASK_EXPOSURE );
237 GrSelectEvents(Invitew, GR_EVENT_MASK_EXPOSURE );
238 GrSelectEvents(PCMw, GR_EVENT_MASK_EXPOSURE );
239 GrSelectEvents(MICw, GR_EVENT_MASK_EXPOSURE );
240
241 GrSelectEvents(ViewIMbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
242 GrSelectEvents(Addbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
243 GrSelectEvents(Loginbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
244 GrSelectEvents(InvitebYw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
245 GrSelectEvents(InvitebNw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
246
247 GrSelectEvents(AddbAw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
248 GrSelectEvents(AddbMw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
249 GrSelectEvents(PCMupbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
250 GrSelectEvents(PCMdownbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
251 GrSelectEvents(MICupbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
252 GrSelectEvents(MICdownbw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
253
254 GrSelectEvents(Offline_list[0].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP);
255 GrSelectEvents(Offline_list[1].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
256 GrSelectEvents(Offline_list[2].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
257 GrSelectEvents(Offline_list[3].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
258 GrSelectEvents(Offline_list[4].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
259
260 GrSelectEvents(Online_list[0].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
261 GrSelectEvents(Online_list[1].Wid, GR_EVENT_MASK_EXPOSURE |
GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
262 GrSelectEvents(Online_list[2].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
263 GrSelectEvents(Online_list[3].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
264 GrSelectEvents(Online_list[4].Wid, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
265
266 GrSelectEvents(EnterAw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN
267 );
268 GrSelectEvents(EnterPw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN
269 );
270 GrSelectEvents(EnterCw, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP | GR_EVENT_MASK_MOUSE_POSITION | GR_EVENT_MASK_KEY_DOWN
271 );
272
273 GrSelectEvents(Tool1w, GR_EVENT_MASK_EXPOSURE);
274 GrSelectEvents(Tool2w, GR_EVENT_MASK_EXPOSURE);
275 GrSelectEvents(Tool3w, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN| GR_EVENT_MASK_BUTTON_UP);
276
277 GrMapWindow(Tablew);
278 GrMapWindow(Loginw);
279 GrMapWindow(Loginbw);
280 GrMapWindow(AddbAw);
281 GrMapWindow(EnterAw);
282 GrMapWindow(EnterPw);
283 GrMapWindow(Tool1w);
284
302 void do_exposure(GR_EVENT_EXPOSURE *ep)
303 {
304 if(ep->wid == Tablew)
305 {
306 GrDrawImageToFit( Tablew, Gc, 0, 0, Table_skin_info.width, Table_skin_info.height, Table_skin_id);
307 }
308 if(ep->wid == Loginw)
309 {
310 GrText(Loginw, Gc, 60, 80, "Account:", -1 , GR_TFASCII);
311 GrText(Loginw, Gc, 60, 120, "Password:", -1, GR_TFASCII);
312
313 GrDrawImageToFit(Loginw,Gc,0,0,Login_skin_info.width,Login_skin_i nfo.height,Login_skin_id);
314
329 GrDrawImageToFit(Listw,Gc,0,0,List_skin_info.width,List_skin_info
330 .height,List_skin_id);
347 //GrText(ViewIMbw, Gc, 19, 20, "Stop",-1, GR_TFASCII);
348 GrLine(ViewIMbw, Gcw, 0, 0, 59, 0);
355 GrText(Loginbw, Gc, 14, 20, "LOGIN",-1, GR_TFASCII);
356 GrLine(Loginbw, Gcw, 0, 0, 59, 0);
363 GrText(AddbAw, Gc, 7, 17, "Add Account",-1, GR_TFASCII);
364 GrLine(AddbAw, Gcw, 0, 0, 79, 0);
378 GrText(InvitebYw, Gc, 20, 20, "Yes",-1, GR_TFASCII);
379 GrLine(InvitebYw, Gcw, 0, 0, 59, 0);
386 GrText(InvitebNw, Gc, 22, 20, "No",-1, GR_TFASCII);
387 GrLine(InvitebNw, Gcw, 0, 0, 59, 0);
399 if(ep->wid == Offline_list[1].Wid)
400 {
401 GrLine(Offline_list[1].Wid, Gcw, 0, 0, 79, 0);
402 GrLine(Offline_list[1].Wid, Gcw, 0, 0, 0, 19);
403 GrLine(Offline_list[1].Wid, Gc, 79, 0, 79, 19);
404 GrLine(Offline_list[1].Wid, Gc, 0, 19, 79, 19);
405 }
406 if(ep->wid == Offline_list[2].Wid)
407 {
413 if(ep->wid == Offline_list[3].Wid)
414 {
420 if(ep->wid == Offline_list[4].Wid)
421 {
427 if(ep->wid == Online_list[0].Wid)
428 {
434 if(ep->wid == Online_list[1].Wid)
435 {
441 if(ep->wid == Online_list[2].Wid)
442 {
448 if(ep->wid == Online_list[3].Wid)
449 {
455 if(ep->wid == Online_list[4].Wid)
456 {
480 GrText(Addw, Gc, 15, 30, "Member's ID:",-1, GR_TFASCII);
481 GrLine(Addw, Gc, 0, 0, 249, 0);
496 GrText(Tool1w, Gc, 16, 20, "Login",-1, GR_TFASCII);
497 GrLine(Tool1w, Gc, 0, 0, 59, 0);
503 GrText(Tool2w, Gc, 22, 20, "List",-1, GR_TFASCII);
504 GrLine(Tool2w, Gc, 0, 0, 59, 0);
510 GrText(Tool3w, Gc, 22, 20, "Exit",-1, GR_TFASCII);
511 GrLine(Tool3w, Gc, 0, 0, 59, 0);
521 * do_buttondown - deal with buttondown Event
522 *---
523 */
524 void do_buttondown(GR_EVENT_BUTTON *bp)
525 {
569 if(bp->wid == Offline_list[0].Wid)
570 {
576 if(bp->wid == Offline_list[1].Wid)
577 {
583 if(bp->wid == Offline_list[2].Wid)
584 {
590 if(bp->wid == Offline_list[3].Wid)
591 {
597 if(bp->wid == Offline_list[4].Wid)
598 {
604 if(bp->wid == Online_list[0].Wid)
605 {
606 GrLine(Online_list[0].Wid, Gc, 0, 0, 79, 0);
607 GrLine(Online_list[0].Wid, Gc, 0, 0, 0, 19);
608 GrLine(Online_list[0].Wid, Gcw, 79, 0, 79, 19);
609 GrLine(Online_list[0].Wid, Gcw, 0, 19, 79, 19);
610 }
611 if(bp->wid == Online_list[1].Wid)
612 {
618 if(bp->wid == Online_list[2].Wid)
619 {
625 if(bp->wid == Online_list[3].Wid)
626 {
632 if(bp->wid == Online_list[4].Wid)
633 {
663 reflash_sound_state(10,0);
664 }
665 if(bp->wid == PCMdownbw)
666 {
667 //if(vol_p!=0)
668 if(vol_v!=0)
669 reflash_sound_state(-10,0);
670 }
671 if(bp->wid == MICupbw)
672 {
673 if(vol_m!=100)
674 reflash_sound_state(0,10);
675 }
676 if(bp->wid == MICdownbw)
677 {
678 if(vol_m!=0)
679 reflash_sound_state(0,-10);
680 }
681 }
682
683 /*---
684 * do_buttonup - deal with buttonup Event
685 *---
686 */
687 void do_buttonup(GR_EVENT_BUTTON *bp)
688 { int i;
708 if(Leave==2)
724 printf("%s %s\n",Account,Password);
725 if(!(Count==0 || Countp==0))
726 {
727 if(Connect_server(Host, Service,Account,Password,0)==0)
728 {
735 GrMapWindow(Offline_list[0].Wid);
736 GrMapWindow(Offline_list[1].Wid);
737 GrMapWindow(Offline_list[2].Wid);
738 GrMapWindow(Offline_list[3].Wid);
739 GrMapWindow(Offline_list[4].Wid);
740 GrMapWindow(Online_list[0].Wid);
741 GrMapWindow(Online_list[1].Wid);
742 GrMapWindow(Online_list[2].Wid);
743 GrMapWindow(Online_list[3].Wid);
744 GrMapWindow(Online_list[4].Wid);
745 GrMapWindow(Onlinew);
754 reflash_sound_state(0,0);
755 }
756 else
757 {
758 show_warning_message("Please check account and password
again!!",1);
781 if(Connect_server(Host, Service,Account,Password,1)==0)
782 {
789 GrMapWindow(Offline_list[0].Wid);
790 GrMapWindow(Offline_list[1].Wid);
791 GrMapWindow(Offline_list[2].Wid);
792 GrMapWindow(Offline_list[3].Wid);
793 GrMapWindow(Offline_list[4].Wid);
794 GrMapWindow(Online_list[0].Wid);
795 GrMapWindow(Online_list[1].Wid);
796 GrMapWindow(Online_list[2].Wid);
797 GrMapWindow(Online_list[3].Wid);
798 GrMapWindow(Online_list[4].Wid);
799 GrMapWindow(Onlinew);
808 reflash_sound_state(0,0);
809 }
810 else
811 {
812 show_warning_message("Please check account and password
again!!",1);
839 Send_Command("#listen_message");
840 Leave=4; %s",Offline_list[i].MemberID);
875 Send_Command(buf);
876
877 Leave=1;
878
879 sprintf(buf,"leave a message to
%s ...",Offline_list[i].MemberID);
880 show_warning_message(buf,3);
%s ...",Online_list[i].MemberID);
904 show_warning_message(buf,3);
905
937 show_warning_message("Already had this friend",1);
938 else
939 {
940 show_warning_message("Add friend ok!!",1);
941 Send_Command("#who");
956 * do_keystroke - deal with keyin Event
957 *---
958 */
959 void do_keystroke(GR_EVENT_KEYSTROKE *kp)
960 {
986 GrGetGCTextSize(Gc, &kp->ch, 1, GR_TFASCII, &width, &height, &base);
987
1006
1007 if(fwin!=EnterPw)
1008 GrText(fwin, Gck, *xpos, Ypos+base, &kp->ch, 1, 0);
1009 else
1020 * show_invite_window
1021 *---
1022 */
1023 void show_invite_window(char *string)
1024 {
1025 GrMapWindow(Invitew);
1026 GrMapWindow(InvitebYw);
1027 GrMapWindow(InvitebNw);
1028
1029 GrText(Invitew, Gc, 10, 20,string,-1, GR_TFASCII);
1030 GrFlush();
1031 }
1032
1033 /*---
1034 * show_warning_message
1035 *---
1036 */
1037 void show_warning_message(char *string,int mode)
1038 {
1039 GrMapWindow(ViewIMw);
1040 if(mode!=3)
1041 GrMapWindow(ViewIMbw);
1042
1043 if(mode==1)
1044 GrText(ViewIMbw, Gc, 19, 20, "OK",-1, GR_TFASCII);
1045 else if(mode==2)
1046 GrText(ViewIMbw, Gc, 19, 20, "Stop",-1, GR_TFASCII);
1047
1056 void close_warning_message(void)
1057 { Clean_windows(ViewIMw);
1058 GrUnmapWindow(ViewIMw);
1059 GrUnmapWindow(ViewIMbw);
1060 GrFlush();
1067 void Clean_windows(GR_WINDOW_ID wid)
1068 {
1077 void back_to_login(void)
1078 {
1079 GrUnmapWindow(Tool2w);
1080 GrUnmapWindow(Tool3w);
1081 GrUnmapWindow(Listw);
1082 GrUnmapWindow(Addw);
1083 GrUnmapWindow(ViewIMw);
1084 GrUnmapWindow(Invitew);
1085 GrMapWindow(Tool1w);
1102 void add_list(int mode,char *id) /*mode 1= Online_list
2=Offline_list*/
1103 {
1104 int i;
1105
1106 if(mode==1)
1107 {
1108 for(i=0;i<Maxlist;i++)
1109 {
1110 if(strcmp(Online_list[i].MemberID,"")==0)
1111 {
1121 if(strcmp(Offline_list[i].MemberID,"")==0)
1122 {
1132 * remove_list - remove id from online or offline list
1133 *---
1134 */
1135 void remove_list(int mode,char *id)
1136 { int i;
1144 strcpy(Online_list[i].MemberID,"");
1145 return;
1146 }
1147
1148 for(i=i+1;i<Maxlist;i++)
1149 strcpy(Online_list[i-1].MemberID,Online_list[i].MemberID);
1150 }
1157 strcpy(Offline_list[i].MemberID,"");
1158 return;
1159 }
1160
1161 for(i=i+1;i<Maxlist;i++)
1162 strcpy(Offline_list[i-1].MemberID,Offline_list[i].MemberID);
1163 }
1164
1165 }
1166 /*---
1167 * clean_list - reflash online and offline list
1168 *---
1169 */
1170 void clean_list(void)
1171 {
1172 int i;
1173 for(i=0;i<Maxlist;i++)
1174 {
1175 strcpy(Online_list[i].MemberID,"");
1176 strcpy(Offline_list[i].MemberID,"");
1177 }
1185 int check_list(int mode,char *id)
1186 {
1198 if(strcmp(Offline_list[i].MemberID,id)==0)
1199 return i;
1205 * reflash_list - reflash online and offline list
1206 *---
1207 */
1208 void reflash_list(void)
1209 { int i;
1210
1211 for(i=0;i<Maxlist;i++)
1212 Clean_windows(Online_list[i].Wid);
1213
1214 for(i=0;i<Maxlist;i++)
1215 if(strcmp(Online_list[i].MemberID,"")!=0)
1216 GrText(Online_list[i].Wid, Gc, 7, 14,
Online_list[i].MemberID,-1, GR_TFASCII);
1217
1218 for(i=0;i<Maxlist;i++)
1219 Clean_windows(Offline_list[i].Wid);
1220
1221 for(i=0;i<Maxlist;i++)
1222 if(strcmp(Offline_list[i].MemberID,"")!=0)
1223 GrText(Offline_list[i].Wid, Gc, 7, 14, Offline_list[i].MemberID,-1, GR_TFASCII);
1224
1232 void reflash_sound_state(int p,int m)
1233 { char temp[20];
1234 int pcm,mic;
1235
1236 Clean_windows(PCMw);
1237 Clean_windows(MICw);
1238
1239 pcm=volume_vol(vol_v+p);
1240
1241 //pcm=volume_pcm(vol_p+p);
1242 mic=volume_mic(vol_m+m);
1243
1244 sprintf(temp,"%d",pcm);
1245 GrText(PCMw, Gck, 20, 13,temp,-1, GR_TFASCII);
1246 sprintf(temp,"%d",mic);
1247 GrText(MICw, Gck, 20, 13,temp,-1, GR_TFASCII);
1248
1249 GrFlush();
1250 }
/*vm_client.h*/
1
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <stdio.h>
6 #include <sys/types.h>
7 #include <errno.h>
8 #include <microwin/nano-X.h>
9 #include <sys/time.h>
10 #include "audio.h"
11
12 #define Maxlist 5
13
14 struct member_list{
15 GR_WINDOW_ID Wid;
16 char MemberID[20];
17
18 };
19
20 typedef struct member_list Member_list;
/* vm_server.c chet and get host voip ip address server*/
1
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <sys/time.h>
5 #include <netinet/in.h>
6 #include <sys/stat.h>
7
8 #include <stdlib.h>
9 #include <pthread.h>
10 #include <unistd.h>
11 #include <string.h>
12 #include <stdio.h>
13 #include <errno.h>
14
15 #define BUFSIZE 800
16 #define QLEN 4 /* maximum connection queue length */
34 struct online Online[QLEN];
35
36 struct send_to_thread{
37 int sock;
43 int passiveTCP(const char *service, int qlen);
44 int passiveUDP(const char *service);
45 void start_service(int ,fd_set *);
46 void Send_Message(int ,char * );
47 void send_list(int);
48 void broadcast_message(int ,char *,fd_set *);
49 void first_connect(int , fd_set *);
50 void *invite_player(void *arg);
51 void *server_control(void *arg);
52 void *leave_message(void *arg);
53 void *listen_message(void *arg);
54 void *check_online_state(void *arg);
55
56 void start_leave_message (char *name ,int sock);
57 int find_name(char *string,int fd);
58 int find_id(int sock);
59 void client_logout(int ,fd_set *);
60 void client_cancel_voip(int );
61 void client_cancel_leave_message(int s);
62 void cancel_thread(pthread_t thread);
63 void get_client_address(void);
64
70 main(int argc, char *argv[])
71 {
87 errexit("usage: voipserver [port]\n");
88 }
89
90 MSOCK = passiveTCP(service, QLEN);
91
92 FD_size = FD_SETSIZE;
93 FD_ZERO(&AFDS);
94 FD_SET(MSOCK, &AFDS);
95
96 pthread_create(&a_thread, NULL, server_control,(void *)MSOCK);
97 pthread_create(&b_thread, NULL, check_online_state,NULL);
98
99 printf("--- Voice Messenger Server ---\n\nMain socket: %d\n",MSOCK);
100
101 while (1) {
102 memcpy(&rfds, &AFDS, sizeof(rfds));
103
104 if (select(FD_size, &rfds, (fd_set *)0, (fd_set *)0,
105 (struct timeval *)0) < 0)
106 continue;
112 ssock = accept(MSOCK, (struct sockaddr *)&fsin,&alen);
113 if (ssock < 0)
114 errexit("accept: %s\n",strerror(errno));
115
116 printf("accect %d socket\n",ssock);
117 /*get playr name*/
118 first_connect(ssock,&AFDS);
119
120 }
121
122 for (fd=0; fd<FD_size; ++fd)
123 if (fd != MSOCK && FD_ISSET(fd, &rfds))
124 start_service(fd,&AFDS);
125
132 * first_connect - create account or client login and set client can be servered or not
133 *---
134 */
135 void first_connect(int sock, fd_set *afds)
136 { char
buf[LINELEN+1],*tok,temp[256],account[20],password[20],a[20],p[20]
;
137 int count,state=0,find=0,i,login=0;/* =0 no such account or passwors error,=1 login ok*/
138 FILE *fp;
139
140 count=read(sock, buf, LINELEN);
141 buf[count]='\0';
142 puts(buf);
143 if(strcmp(buf,"#create")==0)/*create account*/
144 {
145 printf("Create account\n");
146 count=read(sock, buf, LINELEN);
154 fp=fopen("account","a+");
155 /*test account exist or not?*/
156 while(fgets(temp,256,fp))
157 {tok = strtok(temp," ");
167 fprintf(fp,"%s %s\n",account,password);
168 state=1;
169 }
170 fclose(fp);
171 }
172 else if(strcmp(buf,"#login")==0)/*client login*/
173 {
174 printf("Login\n");
175 count=read(sock, buf, LINELEN);
176 buf[count]='\0';
177 puts(buf);
178 if(access("account",R_OK)==0)/*is file exist?*/
179 {
204 break;
221 for(i=0;strcmp(Online[i].name,"")!=0;i++);
222 strcpy(Online[i].name,account);
223 Online[i].sock=sock;
224
225 sprintf(buf,"#login %s",Online[i].name);
226 broadcast_message(sock,buf,afds);
227
241 * server_control - control server
242 *---
243 */
244 void *server_control(void *arg)
245 {
255 if(strcmp(command,"#online")==0)
256 {
257 for(i=0;i<QLEN;i++)
258 if(strcmp(Online[i].name,"")!=0)
259 printf("ID: %d Socket: %d Name:
%s\n",i,Online[i].sock,Online[i].name);
260
261 }
262 if(strcmp(command,"#kick")==0)
263 {
264 puts("which online_ID do you want to kick?");
265 scanf("%d",&id);
266 if(strcmp(Online[id].name,"")!=0)
267 client_logout(Online[id].sock,&AFDS);
268 }
269 }while(strcmp(command,"#shutdown")!=0);
270
280 * check_online_state - 1.5 min to check client online state
281 *---
282 */
283 void *check_online_state(void *arg)
284 { int i;
291 if(strcmp(Online[i].name,"")!=0)
292 {
299 client_logout(Online[i].sock,&AFDS);
300 }
301 }
302 }
303 sleep(90);
304
305 }
306 }
307
308 /*---
309 * start_service - broadcast message or send ip to client
310 *---
311 */
312 void start_service(int fd,fd_set *afds)
313 {
314 char buf[LINELEN+1];
315 int count,i;
316 struct send_to_thread *arg;
317 pthread_t a_thread;
318
319 count = read(fd, buf,LINELEN);
320 buf[count]='\0';
321 printf("socket:%d get: %s\n",fd,buf);/*show what server get*/
322 i=find_id(fd); /*find client's id*/
323
324 if (count <= 0)
325 client_logout(fd,afds);/*socket read fail , close socket*/
326
345 pthread_create(&a_thread, NULL, invite_player,(void *)arg);
346 }
347 /*client accept to open voip*/
348 else if(strcmp(buf,"#yes")==0 && Online[i].answer==2)
349 {
350 Online[i].answer=1;
351 }
352 /*client not accept to open voip*/
353 else if(strcmp(buf,"#no")==0 && Online[i].answer==2)
354 {
372 pthread_create(&Online[i].thread, NULL, leave_message,(void
*)arg);
398 * invite_player - invite player to open voip
399 *---
400 */
401 void *invite_player(void *arg)
402 { char buf[LINELEN+1],*tok;
413 find=find_name(tok,input->sock);
414
422 Send_Message(Online[find].sock,buf);/*tell player there is a
voip invition*/
434 Send_Message(input->sock,"#accept");
435
436 /*get clients's ip and port and send to them*/
437 get_client_address();
438 /*set player talksock,client tlak to who(socket)*/
439 Online[i].talksock=Online[find].sock;
440 Online[find].talksock=input->sock;
441 }
442
443 else/*not accept*/
444 {
445 sprintf(buf,"%s not accept yout invition",Online[find].name);
446 Send_Message(input->sock,buf);
461 * leave_message - To prepareing for leaving a message
462 *---
463 */
464 void *leave_message(void *arg)
465 { char buf[20],temp[LINELEN+1],*tok;
473 res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
474 if(res != 0)
475 {printf("Thread setcancelstste failed!!!\n");
476 exit(1);
477 }
478
479 res=pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);
480 if(res != 0)
481 {printf("Thread setcanceltype failed!!!\n");
482 exit(1);
490 if(access("account",R_OK)==0)/*is file exist?*/
491 {
503 }
518 pthread_exit(NULL);
518 pthread_exit(NULL);