<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>五四陈科学院-坚信科学，分享技术 &#187; 神州数码客户端</title>
	<atom:link href="http://www.54chen.com/tag/%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%81%e5%ae%a2%e6%88%b7%e7%ab%af/feed" rel="self" type="application/rss+xml" />
	<link>http://www.54chen.com</link>
	<description>PHP、JAVA、缓存、架构、经验、分享</description>
	<lastBuildDate>Sat, 11 Feb 2012 17:09:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>[中秋零献] 神州数码802.1x局域网UDP拔号软件MyNet-Gnome源代码大分析（Part3）关键逻辑</title>
		<link>http://www.54chen.com/_linux_/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-3.html</link>
		<comments>http://www.54chen.com/_linux_/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-3.html#comments</comments>
		<pubDate>Sun, 14 Sep 2008 14:10:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[802.1x]]></category>
		<category><![CDATA[神州数码客户端]]></category>

		<guid isPermaLink="false">http://www.54chen.com/_linux_/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-3.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>/*** * Author: cc0cc * E-mail: cc0cc@126.com * WebSite: http://www.54chen.com * Date: the Mid-Autumn Festival of 2008 * FileName: callbacks.c * Description: callbacks.c为事件处理的核心逻辑，是MyNet的中心 ***/ #ifdef HAVE_CONFIG_H # include &#60;config.h&#62; #endif #include &#60;gnome.h&#62; #include "Mythread.h" #include "connect.h" #include "callbacks.h" #include "interface.h" &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p>/***<br />
* Author: cc0cc<br />
* E-mail: cc0cc@126.com<br />
* WebSite: <a href="http://www.54chen.com">http://www.54chen.com</a><br />
* Date: the Mid-Autumn Festival of 2008<br />
* FileName: callbacks.c<br />
* Description: callbacks.c为事件处理的核心逻辑，是MyNet的中心<br />
***/<br />
#ifdef HAVE_CONFIG_H<br />
# include &lt;config.h&gt;<br />
#endif<br />
#include &lt;gnome.h&gt;<br />
#include "Mythread.h"<br />
#include "connect.h"<br />
#include "callbacks.h"<br />
#include "interface.h"<br />
#include "support.h"</p>
<p>gchar line2[255];//用来存去掉回车后的字符串<br />
void write_config(gchar *usr,gchar *pwd);//remember pwd<br />
void write_new_config();//first time to write config<br />
gchar * scape(gchar *line);//escapse the enter like '\n'<br />
/*<br />
* 关于mac和ip的：http://hi.baidu.com/cc0cc/blog/item/403cbb25a0cd9a6435a80fa7.html<br />
*/<br />
char *get_mac();//return the mac address<br />
char *get_ip();//get ip address<br />
int get_socket();<br />
int tr_mac();//translate the mac address<br />
int CreateMutex();//a file like mutex （互斥体，用来保证只能同时运行一个此软件，后来被干掉啦：））<br />
int trayshow;</p>
<p>/*这个是window1，也就是软件一打开的时候会执行这个函数*/<br />
void<br />
on_window1_show                        (GtkWidget       *widget,<br />
                                        gpointer         user_data)<br />
{<br />
/*<br />
//采访一下：为什么要把这段干掉？<br />
//A：因为在程序异常关闭的时候，老是不能自己删除掉原来的PID文件，于是就得手工去删除，实在是不爽，干脆不限制了。<br />
char runfile[1024]="";<br />
FILE *runfp;   <br />
sprintf(runfile,"%s/.mynet/run.pid",getenv("HOME"));</p>
<p>if((runfp = fopen(runfile, "r")) != NULL)<br />
    {   <br />
    gtk_widget_hide(window1);<br />
    getAtrBox = create_messagebox("错误","程序已经运行了！",0);<br />
     gtk_widget_show (getAtrBox);<br />
    }else{<br />
        CreateMutex();<br />
        }<br />
*/<br />
username[0x40]=0;<br />
host[0x1E]=0;<br />
memcpy(host,SERVER,strlen((char *)SERVER));<br />
mac_addr[0x20]=0;<br />
mac_Hex[6]=0;<br />
ip_addr[0x20]=0;<br />
passwd[0x40]=0;<br />
server_type[0x40]=0;<br />
memcpy(server_type,"internet",strlen((char *)"internet"));</p>
<p>gchar *line = ((char *) malloc(255));//is 255b enough?<br />
char cfgfile[1024]="";<br />
FILE *fp;   <br />
   <br />
sprintf(cfgfile,"%s/.mynet/config",getenv("HOME"));<br />
if ((fp = fopen(cfgfile, "r")) == NULL)    write_new_config();//看出来这是在干什么了吗？这是把用户的当前设置给写进一个config文件，就算是windows里的注册表了<br />
else<br />
    {<br />
    fgets(line,254,fp);<br />
    gtk_entry_set_text ((GtkEntry *)entry1,(const gchar *)scape(line));<br />
    memcpy(username,scape(line),strlen(scape(line)));<br />
    fgets(line,254,fp);<br />
    gtk_entry_set_text ((GtkEntry *)entry2,(const gchar *)scape(line));   <br />
    memcpy(passwd,scape(line),strlen(scape(line)));<br />
    fgets(line,254,fp);<br />
    memcpy(ip_addr,scape(line),strlen(scape(line)));<br />
    fgets(line,254,fp);<br />
    memcpy(host,scape(line),strlen(scape(line)));g_message("here1");<br />
    //get_socket((char *)scape(line));//host to<br />
        g_message("%c",&amp;line);<br />
    fgets(line,254,fp);g_message("here3");<br />
    memcpy(mac_addr,scape(line),strlen(scape(line)));g_message("here4");<br />
    tr_mac();g_message("here5");<br />
    }   <br />
g_message("mem now here:usr:%s\npwd:%s\nip:%s\nmac:%s\nserver:%s",username,passwd,ip_addr,mac_addr,host);<br />
free(line);<br />
}</p>
<p>/*这是设置服务器的一个窗口*/<br />
void<br />
on_window2_show                        (GtkWidget       *widget,<br />
                                        gpointer         user_data)<br />
{<br />
    gtk_entry_set_text ((GtkEntry *)entry3,(char *)ip_addr);</p>
<p>    gtk_entry_set_text ((GtkEntry *)entry4,(char *)host);   </p>
<p>    gtk_combo_box_append_text (GTK_COMBO_BOX (comboboxentry1),(char *)mac_addr);<br />
    gtk_combo_box_set_active(GTK_COMBO_BOX (comboboxentry1),0);<br />
   <br />
}</p>
<p>/*这个是哪个button?...是设置属性的那个按钮*/<br />
void<br />
on_button3_clicked                     (GtkButton       *button,<br />
                                        gpointer         user_data)<br />
{<br />
    GtkWidget *mac_set;<br />
    mac_set = create_window2 ();<br />
     gtk_widget_show (mac_set);<br />
    return;<br />
}</p>
<p>/*<br />
*这个是什么东东？ 记好了，这个在后面要用的，用来数数的计时的。<br />
*/<br />
gint<br />
flash_timeout(gpointer data)<br />
{if(Acc_Keep_Link==-1){<br />
    gtk_widget_hide_all (linkwindow);<br />
    gtk_widget_show_all (window1);<br />
    getAtrBox = create_messagebox("提示","与网络连接中断！",1);<br />
     gtk_widget_show_all (getAtrBox);<br />
    return FALSE;<br />
    }<br />
    create_tray(tray);<br />
    return TRUE;<br />
}</p>
<p>/*关键的一个来了！！这就是主界面中的连接按钮！主逻辑从它开始*/<br />
void<br />
on_button1_clicked                     (GtkButton       *button,<br />
                                        gpointer         user_data)<br />
{   <br />
/*这个的意思是，如果连接的时候选择了记住密码，那么就要把用户名密码写进config文件去，不然的话就写个用户名得了*/<br />
if(gtk_toggle_button_get_active((GtkToggleButton *)checkbutton1))<br />
write_config((gchar *)gtk_entry_get_text ((GtkEntry *)entry1),<br />
            (gchar *)gtk_entry_get_text ((GtkEntry *)entry2));<br />
else<br />
write_config((gchar *)gtk_entry_get_text ((GtkEntry *)entry1),<br />
            "");   <br />
gtk_widget_hide_all (window1);//所有窗口隐藏掉。。。<br />
linkwindow = create_window3 ();//window3就是“请稍候”的那个窗口，大家都隐藏的时候它就要出来了<br />
gtk_widget_show_all (linkwindow);<br />
gint ptimer_flash=0;<br />
gtk_timeout_remove(ptimer_flash);<br />
ptimer_flash=gtk_timeout_add(15000,flash_timeout,NULL);    //这是一个计时器，每1.5秒执行一次flash_timeout<br />
   <br />
pthread_t getaccess;<br />
Acc_Keep_Link=0;<br />
memcpy(username,(char *)gtk_entry_get_text ((GtkEntry *)entry1),strlen((char *)gtk_entry_get_text ((GtkEntry *)entry1)));<br />
memcpy(passwd,(char *)gtk_entry_get_text ((GtkEntry *)entry2),strlen((char *)gtk_entry_get_text ((GtkEntry *)entry2)));<br />
pthread_create(&amp;getaccess,NULL,Access_Thread,NULL);//这会创建一个叫getaccess的线程<br />
}</p>
<p>/*垃圾按钮~~就是获取服务的那个按钮*/<br />
void<br />
on_button4_clicked                     (GtkButton       *button,<br />
                                        gpointer         user_data)<br />
{<br />
memcpy(host,(char *)gtk_entry_get_text ((GtkEntry *)entry4),strlen((gchar *)gtk_entry_get_text ((GtkEntry *)entry4)));<br />
write_config((gchar *)gtk_entry_get_text ((GtkEntry *)entry1),<br />
            "");</p>
<p>    get_socket((char *)gtk_entry_get_text ((GtkEntry *)entry4));<br />
    getAtrBox = create_messagebox("提示","恭喜，获取服务成功！",1);<br />
     gtk_widget_show (getAtrBox);<br />
    return;//sorry i can not understand what is this<br />
}</p>
<p>/*<br />
* 当断开网络时会用<br />
*/<br />
void<br />
before_quit                      (GtkWidget       *widget,<br />
                                        gpointer         user_data)<br />
{<br />
/*<br />
char cfgfile[1024]="";<br />
sprintf(cfgfile,"%s/.mynet/run.pid",getenv("HOME"));<br />
unlink(cfgfile);//delete mutex file*/<br />
   <br />
if(gtk_toggle_button_get_active((GtkToggleButton *)checkbutton1))<br />
write_config((gchar *)gtk_entry_get_text ((GtkEntry *)entry1),<br />
            (gchar *)gtk_entry_get_text ((GtkEntry *)entry2));//remember the passwd<br />
close(sockfd);<br />
gtk_main_quit();<br />
}</p>
<p>/*先说过的，用来写文件记录用户的基本信息的*/<br />
void write_new_config()<br />
{<br />
int log;<br />
char filename[1024];<br />
char log_string[1024];<br />
char filepath[1024];<br />
char *dir;<br />
strcpy(log_string,"");<br />
strcat(log_string,"\n");memcpy(username,"0",strlen((char *)username));<br />
strcat(log_string,"\n");memcpy(passwd,"0",strlen((char *)passwd));<br />
get_ip();   <br />
strcat(log_string,(char *)ip_addr);strcat(log_string,"\n");<br />
strcat(log_string,SERVER);strcat(log_string,"\n");<br />
get_mac();tr_mac();<br />
strcat(log_string,(char *)mac_addr);strcat(log_string,"\n");<br />
dir=getenv("HOME");<br />
sprintf(filepath,"%s/.mynet/",dir);<br />
mkdir(filepath,O_RDWR|O_CREAT|O_TRUNC);<br />
chmod(filepath,0777);<br />
sprintf(filename,"%sconfig",filepath);<br />
log=open(filename,O_RDWR|O_CREAT|O_TRUNC,0777);<br />
chmod(filename,0777);<br />
write(log,log_string,strlen(log_string));<br />
close(log);   <br />
}</p>
<p>/*下面这个东东把line也就是存成文件了的用户名密码（原来是回车分隔的），这些东东一行一行地取出来*/<br />
gchar * scape(gchar *line)<br />
{<br />
int i;<br />
int j;<br />
for(i=0;i&lt;254;i++)line2[i]=NULL;//这个主要目的是全部干成空的<br />
for(i=0;i&lt;254;i++){if((line[i]=='\n')||(line[i]=='\r'))break;}//一旦遇到回车直接就over掉<br />
for(j=0;j&lt;i;j++){line2[j]=line[j];/*g_message("%c",line[j]);*/}//复制到line2中<br />
return line2;<br />
}</p>
<p>/*和write_new_config相比少个new，在用户名密码更改的时候才用的*/<br />
void write_config( gchar* usr, gchar* pwd)<br />
{<br />
int log;<br />
char filename[1024];<br />
char log_string[1024];<br />
char filepath[1024];</p>
<p>strcpy(log_string,"");<br />
strcat(log_string,usr);strcat(log_string,"\n");<br />
strcat(log_string,pwd);strcat(log_string,"\n");<br />
strcat(log_string,(char *)ip_addr);strcat(log_string,"\n");<br />
strcat(log_string,(char *)host);strcat(log_string,"\n");<br />
strcat(log_string,(char *)mac_addr);strcat(log_string,"\n");</p>
<p>sprintf(filepath,"%s/.mynet/",getenv("HOME"));<br />
mkdir(filepath,O_RDWR|O_CREAT|O_TRUNC);<br />
chmod(filepath,0777);<br />
sprintf(filename,"%sconfig",filepath);<br />
log=open(filename,O_RDWR|O_CREAT|O_TRUNC,0777);<br />
chmod(filename,0777);<br />
write(log,log_string,strlen(log_string));<br />
close(log);   <br />
}</p>
<p>void<br />
delete_event                     (GtkButton       *button,<br />
                                        gpointer         user_data)<br />
{<br />
before_quit((GtkWidget *)button,(gpointer)user_data);<br />
}</p>
<p>char *<br />
get_mac()<br />
{<br />
        int nSocket;<br />
        struct ifreq struReq;<br />
        nSocket = socket(PF_INET,SOCK_STREAM,0);<br />
        memset(&amp;struReq,0,sizeof(struReq));<br />
        strncpy(struReq.ifr_name, "eth0", sizeof(struReq.ifr_name));  <br />
        ioctl(nSocket,SIOCGIFHWADDR,&amp;struReq);<br />
        close(nSocket);<br />
        //strcpy(mac_addr,(BYTE)ether_ntoa(struReq.ifr_hwaddr.sa_data));<br />
        memcpy(mac_addr,(char *)ether_ntoa(struReq.ifr_hwaddr.sa_data),strlen((char *)ether_ntoa(struReq.ifr_hwaddr.sa_data)));<br />
        //g_message("\n get_mac: %s\n",(char *)ether_ntoa(struReq.ifr_hwaddr.sa_data)+1);<br />
        //g_message("\n mem_mac : %s lenth:%d\n",mac_addr,strlen((char *)mac_addr));<br />
        return 0;<br />
}</p>
<p>char *<br />
get_ip()<br />
{<br />
           int sock;<br />
           struct sockaddr_in sin;<br />
           struct ifreq ifr;  <br />
           sock = socket(AF_INET, SOCK_DGRAM, 0);<br />
           if (sock == -1)<br />
           {<br />
                       perror("socket");<br />
                       return "";                         <br />
           }<br />
            <br />
           strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name));      <br />
   <br />
           if (ioctl(sock, SIOCGIFADDR, &amp;ifr) &lt; 0)<br />
           {<br />
                       perror("ioctl");<br />
                       return "";<br />
           }</p>
<p>           memcpy(&amp;sin, &amp;ifr.ifr_addr, sizeof(sin));  <br />
           close(sock);<br />
           memcpy(ip_addr,inet_ntoa(sin.sin_addr),strlen(inet_ntoa(sin.sin_addr)));<br />
           //g_message("\n get_ip:eth0: %s\n",inet_ntoa(sin.sin_addr));<br />
           //g_message("\n mem_ip: %s",ip_addr);<br />
           return "";<br />
}</p>
<p>int<br />
get_socket()<br />
{ char *ser;<br />
    ser=(gchar *)gtk_entry_get_text ((GtkEntry *)entry4);<br />
    //digtalser<br />
           sockfd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);<br />
           if (sockfd == -1)<br />
           {<br />
                       perror("socket");<br />
                       return 0;                         <br />
           }<br />
           client.sin_family=AF_INET;<br />
           client.sin_port=htons(3848);<br />
           //client.sin_addr=inet_addr(host);   <br />
           inet_pton(AF_INET, ser, &amp;client.sin_addr);           <br />
           //g_message("udp socket ok!%d",sockfd);<br />
           return 1;<br />
}<br />
int<br />
chToHex(int x)//字符转成十六进制用<br />
{<br />
if(x&gt;=97&amp;&amp;x&lt;=102)x=x-87;<br />
else x=x-48;<br />
return x;<br />
}<br />
int<br />
tr_mac()<br />
{<br />
int p,i;</p>
<p>p=0;<br />
for(i=0;i&lt;6;i++)<br />
    {<br />
    if (mac_addr[p+1]==':'){mac_Hex[i]=chToHex((int)mac_addr[p]);p+=2;}<br />
      else{mac_Hex[i]=16*(chToHex((int)mac_addr[p]))+chToHex((char)mac_addr[p+1]);p+=3;}   <br />
    }<br />
//g_message("%s",mac_addr);<br />
//for(i=0;i&lt;6;i++)<br />
//g_message("%d---%c-%c-%c-%c",mac_Hex[i],mac_addr[i],mac_addr[i+1],mac_addr[i+2],mac_addr[i+3]);<br />
return 0;<br />
}</p>
<p>int<br />
CreateMutex()//a file like mutex<br />
{<br />
int log;<br />
char filename[1024];<br />
char log_string[1024];<br />
char filepath[1024];<br />
char *dir;<br />
strcpy(log_string,"MyNet");<br />
dir=getenv("HOME");<br />
sprintf(filepath,"%s/.mynet/",dir);<br />
mkdir(filepath,O_RDWR|O_CREAT|O_TRUNC);<br />
chmod(filepath,0777);<br />
sprintf(filename,"%srun.pid",filepath);<br />
log=open(filename,O_RDWR|O_CREAT|O_TRUNC,0777);<br />
chmod(filename,0777);<br />
write(log,log_string,strlen(log_string));<br />
close(log);   <br />
return 1;   <br />
}</p>
<p>void<br />
delete_getAtrBox()<br />
{<br />
gtk_widget_hide (getAtrBox);<br />
}</p>
<p>/***<br />
* Author: cc0cc<br />
* E-mail: cc0cc@126.com<br />
* WebSite: <a href="http://www.54chen.com">http://www.54chen.com</a><br />
* Date: the Mid-Autumn Festival of 2008<br />
* FileName: callbacks.c<br />
***/<br />
Part4将讲述getaccess线程内的故事，该线程完整再现UDP拔号的情境，待续。。。</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/_linux_/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[中秋零献] 神州数码802.1x局域网UDP拔号软件MyNet-Gnome源代码大分析（Part2）</title>
		<link>http://www.54chen.com/php-tech/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-2.html</link>
		<comments>http://www.54chen.com/php-tech/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-2.html#comments</comments>
		<pubDate>Sun, 14 Sep 2008 13:10:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[802.1x]]></category>
		<category><![CDATA[mynet]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[神州数码客户端]]></category>

		<guid isPermaLink="false">http://www.54chen.com/php-tech/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-2.html</guid>
		<description><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br>/*** * Author: cc0cc * E-mail: cc0cc@126.com * WebSite: http://www.54chen.com * Date: the Mid-Autumn Festival of 2008 * FileName: main.c ***/ /* * Initial main.c file generated by Glade. Edit as required. * Glade will not overwrite this file. */ &#8230;<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></description>
			<content:encoded><![CDATA[<a href="http://www.54chen.com"><img border="0" src="http://www.54chen.com/wp-content/themes/54chen2011/images/54chen-logo.gif"></a><br>以下内容由<a href="http://www.54chen.com">[五四陈科学院]</a>提供<br><p>/***<br />
* Author: cc0cc<br />
* E-mail: cc0cc@126.com<br />
* WebSite: <a href="http://www.54chen.com">http://www.54chen.com</a><br />
* Date: the Mid-Autumn Festival of 2008<br />
* FileName: main.c<br />
***/<br />
/*<br />
* Initial main.c file generated by Glade. Edit as required.<br />
* Glade will not overwrite this file.<br />
*/</p>
<p>#ifdef HAVE_CONFIG_H<br />
# include &lt;config.h&gt;<br />
#endif<br />
#include &lt;stdio.h&gt;<br />
#include &lt;gtk/gtk.h&gt;<br />
#include &lt;pthread.h&gt;</p>
<p>#include &lt;gnome.h&gt;<br />
/*如果没记错的话eggtrayicon.h/tray.h都是在Linux用来做系统托盘的头文件，参见<br />
*http://hi.baidu.com/cc0cc/blog/item/26da147a4a428ce92f73b3da.html<br />
*/<br />
#include "eggtrayicon.h"<br />
#include "tray.h"<br />
#include "interface.h"<br />
#include "support.h"<br />
#include "connect.h"</p>
<p>/*系统托盘*/<br />
static void activate_action (GtkAction * action);<br />
static void net_quit (GtkAction * action);<br />
static const gchar *ui_info =<br />
    "&lt;ui&gt;"<br />
    " &lt;popup name='PopupMenu'&gt;"<br />
    "    &lt;menuitem action='About'/&gt;"<br />
    "    &lt;separator/&gt;"<br />
    "    &lt;menuitem action='Quit'/&gt;"<br />
    " &lt;/popup&gt;"<br />
    "&lt;/ui&gt;";<br />
static GtkActionEntry entries[] = {<br />
    {"Quit", GTK_STOCK_QUIT,    /* name, stock id */<br />
    N_("_断开"), "&lt;control&gt;Q",    /* label, accelerator */<br />
    N_("Quit"),        /* tooltip */<br />
    G_CALLBACK (net_quit)},<br />
    {"About", GTK_STOCK_ABOUT,    /* name, stock id */<br />
    N_( "_关于"), "&lt;control&gt;A",    /* label, accelerator 关于断开*/<br />
    N_("About"),        /* tooltip */<br />
    G_CALLBACK (activate_action)},<br />
};static guint n_entries = G_N_ELEMENTS (entries);<br />
/*系统托盘END*/</p>
<p>/*GTK程序入口*/<br />
int<br />
main (int argc, char *argv[])<br />
{</p>
<p>    GtkUIManager *ui;<br />
    GError *error = NULL;<br />
    GtkActionGroup *actions;<br />
#ifdef ENABLE_NLS<br />
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);<br />
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");<br />
textdomain (GETTEXT_PACKAGE);<br />
#endif<br />
gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE,<br />
                      argc, argv,<br />
                      GNOME_PARAM_APP_DATADIR, PACKAGE_DATA_DIR,<br />
                      NULL);<br />
window1 = create_window1 ();//这是第一个界面，也就是一出来的时候等待输入密码进行连接的界面<br />
    //g_thread_create(thread1,NULL,NULL,NULL);//wait for the book <img src='http://www.54chen.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
     //pthread_create(&amp;tid,NULL,thread1,NULL);//it is not so good!<br />
     tray = g_new0 (tray_demo, 1);//这里开始弄系统托盘<br />
    tray-&gt;window_main = window1;<br />
    create_tray(tray);<br />
    actions = gtk_action_group_new ("Actions");<br />
    gtk_action_group_set_translation_domain (actions, GETTEXT_PACKAGE);<br />
    gtk_action_group_add_actions (actions, entries, n_entries, NULL);<br />
    ui = gtk_ui_manager_new ();<br />
    gtk_ui_manager_insert_action_group (ui, actions, 0);<br />
    gtk_window_add_accel_group (GTK_WINDOW (window1),<br />
                    gtk_ui_manager_get_accel_group (ui));<br />
    if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &amp;error))<br />
    {<br />
        g_message ("building menus failed: %s", error-&gt;message);<br />
        g_error_free (error);<br />
    }<br />
    tray-&gt;ui = ui;<br />
    tray-&gt;actions = actions;<br />
    tray-&gt;menus = gtk_ui_manager_get_widget (ui, "/PopupMenu");//这段代码可以在gnome中国的网站上找到。。:)<br />
g_message("ccc");   <br />
gtk_widget_show (window1);<br />
gtk_main ();g_message("here2!");<br />
return 0;<br />
}</p>
<p>//下面两个都是为系统托盘的事件做的<br />
static void<br />
activate_action (GtkAction * action)<br />
{   GtkWidget *about;<br />
    about = create_aboutdialog1 ();<br />
     gtk_widget_show (about);<br />
    return;<br />
}<br />
static void<br />
net_quit (GtkAction * action)<br />
{<br />
    Acc_Keep_Link=-1;<br />
    gtk_widget_show_all (window1);<br />
    send_access_request();<br />
    //g_message("net_quit!");<br />
}</p>
<p>/***<br />
* Author: cc0cc<br />
* E-mail: cc0cc@126.com<br />
* WebSite: <a href="http://www.54chen.com">http://www.54chen.com</a></p>
<p>* Date: the Mid-Autumn Festival of 2008<br />
***/</p>
<br><br>想快点找到作者也可以到Twitter上留言: <a href="https://www.twitter.com/54chen" target="_blank">@54chen</a><br>或者你懒得带梯子上墙，请到新浪微博：<a href="http://t.sina.com.cn/54chen" target="_blank">@54chen</a>]]></content:encoded>
			<wfw:commentRss>http://www.54chen.com/php-tech/%e4%b8%ad%e7%a7%8b%e9%9b%b6%e7%8c%ae-%e7%a5%9e%e5%b7%9e%e6%95%b0%e7%a0%818021x%e5%b1%80%e5%9f%9f%e7%bd%91udp%e6%8b%94%e5%8f%b7%e8%bd%af%e4%bb%b6mynet-gnome%e6%ba%90%e4%bb%a3%e7%a0%81%e5%a4%a7-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

