preload
六月 11

最近搞了一台PC來取代原有的web server. 裝好CentOS後, 並順利的將原web server轉移到此台PC.
起初, 還蠻順利的將server轉移過來. 今天連上這台server時, 才發現時間誤差了8小時!!
Continue reading »

五月 19


若有架e-mail server的朋友, 可以用這個Open Relay測試來測試你的server是否有Open Relay.
若有的話, 趕緊更改設定吧, 以免被別人拿來當發垃圾信件的主機.

五月 08


這幾天, 因為無聊, 上網看了一些socket的function, 順手抄了一個簡單的socket程式.
但是這程式總是很不穩定.
怪怪! server端的程式, run 了第二次後, bind() 就會產生』Address already in use』的錯誤訊息.

上Google查了一下, 才知道bind() 之後, 若程式已經結束, 雖然已經正常把socket給close() 了,
但是kernel並不會release這個TCP 的connectioin, 它的狀態會keep 在』TIME_WAIT』狀態. (可以用netstat -t查詢)
要好幾分鐘後, kernel才會release 掉.
怪怪!! 搞不懂為何要做成這樣?? 算了! 找到解答就好.
在bind() 之前加上

setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, reuseaddr_len);

來告訴bind(), 若這個address 假設已經被佔用了, 那就重複使用吧.
完整的code 如下:
Server端:


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>    /* signal name macros, and the signal() prototype */

#define DAEMON_LOCK "/tmp/hao_lock"
int listenFd, connectFd;
char    ttt[]="12345";

void catch_int(int sig_num);

pid_t CheckLock(void)
{
  pid_t me;
  FILE * fp; 

  fp = fopen(DAEMON_LOCK,"rt");
  if (fp==NULL) return 0;
  fscanf(fp,"%d",&me);
  fclose(fp); 

  return me;
} 

pid_t WriteLock(void)
{
  pid_t me;
  FILE *fp; 

  me = getpid(); 

  fp = fopen(DAEMON_LOCK,"w");
  fprintf(fp,"%d",me);
  fclose(fp); 

  return me;
} 

int CleanLock(void)
{
  return (unlink(DAEMON_LOCK)==0);
} 

int init_server(int type, const struct sockaddr *addr, socklen_t alen, int qlen)
{
    int fd;
    int err = 0;
    int reuseaddr = 1;
    socklen_t reuseaddr_len;

    if((fd = socket(addr->sa_family, type, 0)) < 0)
        return (-1);

    reuseaddr_len = sizeof(reuseaddr);
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, reuseaddr_len);

    if(bind(fd, addr, alen) < 0) {
        err = errno;
        goto errout;
    }
    WriteLock();

    if((type == SOCK_STREAM) || (type == SOCK_SEQPACKET)) {
        if(listen(fd, qlen) < 0) {
            err = errno;
            goto errout;
        }
    }
    return (fd);
errout:
    close(fd);
    errno = err;
    return(-1);
}

int main(int argc, char *argv[])
{
    struct sockaddr_in serverAddr;
    pid_t   myself;

    time_t  ticks;
    char    buf[1024];

    listenFd = -1;
    connectFd = -1;

    /* find myself */
    myself = CheckLock();
    if (myself!=0) {
        printf("Existing a copy of chess daemon[pid=%d], leave now.\n",myself);
        exit(1);
    } 

    /* set the INT (Ctrl-C) signal handler to 'catch_int' */
    signal(SIGINT, catch_int);

    bzero(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    // any internet interface on ths server.
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port        = htons(13000);

    if((listenFd = init_server(SOCK_STREAM, (const struct sockaddr *)&serverAddr, sizeof(serverAddr), 5)) < 0) {
        perror("init_server");
        exit(1);
    }
    printf("Init Done..\n");
    for( ; ; ) {
        if((connectFd = accept(listenFd, NULL, NULL)) == -1) {
            perror("\n accept() error");
            exit(1);
        }
        fputs("Server: Connected!!\n",stdout);
        ticks = time(NULL);
        sprintf(buf,"%.24s\r\n", ctime(&ticks));
        write(connectFd, buf, strlen(buf));

        shutdown(connectFd, 2);
        close(connectFd);
    }
    return 0;
}

void catch_int(int sig_num)
{

    signal(SIGINT, catch_int);

    if(listenFd > 0)
        close(listenFd);
    CleanLock();

    printf("\n Done\n");
    exit(0);

}

Client端:


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define MAXSLEEP 128
int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen)
{

    int nsec;
    // Try to connect with exponential backoff.
    for(nsec = 1; nsec <= MAXSLEEP; nsec <<= 1) {
        if(connect(sockfd, addr, alen) == 0) {
            // Connection accepted.
            return(0);
        }
        // Delay before trying again.
        printf("Retry..\n");
        if(nsec <= MAXSLEEP/2)
            sleep(nsec);
    }
    return (-1);
}

int main(int argc, char *argv[])
{
    struct sockaddr_in serverAddr;
    int sockFd, n;
    char buf[1025];

    if(argc != 2) {
        fputs("usage: a.out \n", stdout);
        return -1;
    }

    // set a tcp/ip socket
    sockFd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockFd <= -1) {
        perror("\n Create socket error!");
        exit(1);
    }

    bzero(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port   = htons(13000);
    // host IP # in dotted decimal format !
    inet_pton(AF_INET, argv[1], &serverAddr.sin_addr);

    connect_retry(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));

    while(( n = read(sockFd, buf, sizeof(buf))) > 0) {
        buf[n] = 0;
        fputs(buf, stdout);
    }
    shutdown(sockFd, 2);
    close(sockFd);
    return 0;
}

以上的code, 大部分都是抄來的, 故不保證沒有問題.

若是使用AF_UNIX方式來連接, 那就不是上述方式來解決.
因為AF_UNIX方式會產生一個file, 只要離開程式之前, 呼叫unlink() 把它delete掉即可.
參考:
http://blog.chinaunix.net/u2/67414/showart_1889821.html

三月 24

Dropbox 簡介:
他是一個免費的網路硬碟軟體, 提供2GB的空間可以讓你免費使用. 當然若你需要更大的空間, 就要付費啦. 不過, 2GB應該已經夠大部分的人使用了.
它的特色有:
1. 自動同步功能:
當你有2台電腦, PC_A 和PC_B 這兩台都裝上Dropbox, 且共用一個帳號時. 當你在PC_A放入一個檔案後, Dorpbox 會自動和server 同步. 當PC_A和server同步完成時, PC_B會自動偵測到有新檔案並自動更新. 因此PC_B 也有跟PC_A一樣的檔案了.
2. 目錄分享功能:
你可以指定一個目錄和你的朋友一起共享. 當然你的朋友也必須要有Dropbox的帳號. 當你把一個檔案放到這個分享目錄下. 你的朋友的電腦也自動會收到這個檔案.
3. 可以跨平台使用:
它支援Windows, Mac, Linux. 所以不管你的朋友用啥作業系統, 都可以相互分享.

這一切動作全都是自動完成,你只需要把檔案copy到Dropbox指定的目錄即可. 其他都不用去管. 它會搞定一切所有的動作.

Ok, 了解Dropbox之後, 那就大概知道如何讓你的電腦和你朋友的電腦共同分享檔案吧.
(1) 先去申請一個Dropbox帳號. 用這個連結去申請. (這是我帳號的邀請函, 用這個邀請函申請, 我和你都可以多250MB空間, 哈哈, 利人也利己)
(2) 當帳號申請完成後. 去下載Dropbox軟體. 再http://www.getdropbox.com/下載Dropbox軟體:
目前Mac 的檔案版本是 Dropbox 0.6.402.dmg
(3) 下載完後, 點選Dopbox 0.6.402.dmg 檔, 會出現如下畫面
dropbox1
點選 『Agree』
dropbox2
將左邊的圖案Dropbox.app 拖拉到右邊的圖案上Application 即可.

然後在你的應用程式中找到Dropbox.app, 並執行它.
第一次執行時, 它會問你一些問題. 其中只要記得輸入你剛剛申請的帳號密碼. 其餘的用內定值即可.
然後在Finder中就可以看到Dropbox的目錄啦.
dropbox3
接下來就是把你要同步或分享的檔案copy到這個目錄即可.

你也可以連上Dropbox網頁https://www.getdropbox.com/home, 觀看你的網路硬碟狀況. 用iphone也可以看喔!!

在這個Dropbox目錄下, 你可以建立任何的目錄, 就像是一般目錄的操作一樣. 你也可以把某個目錄分享給你的朋友.
只要在那個目錄按下滑鼠右鍵, 就可以看到Dropbox->Sharing Options…
dropbox4

enjoy it !!

三月 10

想嘗試Dropbox 這個好用且免費的網路硬碟嗎?

提供下列免費的邀請函,
喜歡就拿去去試試吧~~

https://www.getdropbox.com/referrals/NTcyOTc1Mzk

二月 24

最近家裡的Solaris server的NIS一直都沒有搞的很清楚.
這裡有詳細的解說.
現記下網址, 等有空的時候再努力研讀吧~~

PS:懶惰的個性又在作祟了 XD

一月 19

最近不知為何, 在好幾台server 中執行yum , 都會失敗.
出現如下的訊息:
Loading "installonlyn" plugin
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: xxx
......
雖然server重新開機後可解決此狀況. 但是並不是所有的server都允許常常重開機.
後來找到解法:
參考下列網頁
http://linux.derkeiler.com/Mailing-Lists/Fedora/2008-04/msg00460.html

1) Become superuser
2) Make sure no instances or 'rpm' or 'yum' are running
3) rm /var/lib/rpm/__db.*
4) rpm --rebuilddb

看來好像rpm 的設計有點爛 :(

一月 05

Solaris的NFS

Linux, Network, solaris 迴響已關閉

以下文章來至於http://edwardhuang.pixnet.net/blog/post/15645490


========================================================================
在 solaris 中,並不像其它的 UNIX 系統一樣,要利用 NFS 來 export硬碟是去修
改 /etc/exports. 而是要去修改 /etc/dfs/dfstab 這個檔. 設定的方法如下:

利用 share 來 export 硬碟,share 的參數如下:

Attrib         Description
===============================================
-ro          Export read-only, or of used in the form -ro=list, restrict
             access only for the listed hosts.
-rw          Export read-write, or if used in the form -rw=list, allow
             writing only by the listed hosts.
-root=list   Lists hosts permitted to access this filesystem as root. Other-
             wise, root access from a client is equivalent to access by the
             user nobody (usually UID -2).
-anon=n      Specifies UID used for requests coming from an unknown user.
             If not specified, defaults to nobody.

以下舉一個例子,說明 /etc/dfs/dfstab 的寫法.

#       Place share(1M) commands here for automatic execution
#       on entering init state 3.
#
#       Issue the command '/etc/init.d/nfs.server start' to run the NFS
#       daemon processes and the share commands, after adding the very
#       first entry to this file.
#
#       share [-F fstype] [ -o options] [-d ""] [resource]
#       .e.g,
#       share  -F nfs  -o rw=engineering  -d "home dirs"  /export/home2

share  -F nfs  -o rw=sparc,root=sparc  -d "File System" /
share  -F nfs  -o rw=sparc,root=sparc:sparc1:sparc2  -d "User Directory" /usr

1.第一行 share 是把 / (root) share 給一台叫 sparc 的機器,且權限為可以 rw.
2.第二行同樣是把 /usr 這個目錄 share 給 sparc,sparc1,sparc2 這三台機器,
  權限亦為 rw.

 exp.    share  -F nfs  -o rw=sun2,root=sun2  -d "sun1_home" /export/home
  or      share -F nfs -o rw,anon=0 /export/home 

修改完之後,以 root 的身份執行 shareall 即可.

檢查 /etc/dfs/sharetab 是否編輯成功

還有另外一篇http://edwardhuang.pixnet.net/blog/post/15645154


solaris NFS file server
1.How to Start and Stop NFS server
  #/etc/init.d/nfs.server start
  #/etc/init.d/nfs.server stop
2.開機自動分享nfs的檔案系統
修改
/etc/dfs/dfstab檔案
#vi /etc/dfs/dfstab
會看到以下畫面,#是註解

#    Place share(1M) commands here for automatic execution
#    on entering init state 3.
#
#    Issue the command 'svcadm enable network/nfs/server' to
#    run the NFS daemon processes and the share commands, after adding
#    the very first entry to this file.
#
#    share [-F fstype] [ -o options] [-d "<text>"] <pathname> [resource]
#    .e.g,
#    share  -F nfs  -o rw=engineering  -d "home dirs"  /export/home2
#   上面有簡單的說明,以下兩行是自己設定的
share -F nfs -o rw,anon=0 -d "nfs_share" /export/home/nfs
share -F nfs -o ro,anon=0 -d "mp3_share" /export/home/samba

3.開機後手動分享檔案的方法
#share -F nfs -o rw,anon=0 -d "nfs_share" /export/home/nfs
#shareall
這樣就可以將檔案分享出去了

4.mount 已經分享的NFS檔案系統
#mount -F nfs ipaddress:/patch mount point
example:
#mount -F nfs 10.0.0.1:/export/home /mnt

4.取消分享的方法
#unshare -F nfs /mnt
取消所有的分享
#unshareall

5.查看分享了哪些檔案
查看server本身有哪些分享

#share
查看別台server 有哪些分享
#dfshares -F nfs ip address or hostname
example
#dfshares -F nfs 192.168.11.200
十二月 26

Demonoid.com

Network 迴響已關閉

無意中發現了這個好站~~

http://www.demonoid.com

嘿嘿~~
只可惜目前尚未有invitation code….
不過還是可以稍微地挖寶….

ps: How to get a invitation code ??

十二月 11

Continue reading »