顯示具有 network 標籤的文章。 顯示所有文章
顯示具有 network 標籤的文章。 顯示所有文章

2020年3月8日 星期日

open the firewall in Ubuntu

開啟防火牆

sudo ufw enable


允許MySQL連線
sudo ufw allow mysql


允許SSH連線
sudo ufw allow ssh


sudo ufw allow 22


參考資料:
UFW Essentials: Common Firewall Rules and Commands
Install MySQL Server on the Ubuntu operating system 

2015年5月11日 星期一

ip6tables

ip6tables跟iptables極為相似~
而ip6tables是專門在處理IPv6的封包所使用的。

這裡是收集使用過的ip6tables指令
ip6tables -t filter -L -v
顯示filter table的「詳細」設定
因為有加入-v
因此會顯示較為詳細的資料

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   15  3579 ACCEPT     all      any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
   38  2736 ACCEPT     icmpv6    any    any     anywhere             anywhere            ipv6-icmp neighbour-solicitation 
   45  3104 ACCEPT     icmpv6    any    any     anywhere             anywhere            ipv6-icmp neighbour-advertisement 
  175 22368 ACCEPT     icmpv6    any    any     anywhere             anywhere            ipv6-icmp router-advertisement 
    2   112 ACCEPT     icmpv6    any    any     anywhere             anywhere            ipv6-icmp router-solicitation 
    6   958 ACCEPT     udp      any    any     anywhere             anywhere            udp dpt:546 
    2   316 ACCEPT     all      br0    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1079  493K ACCEPT     all      any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
  371 38824 ACCEPT     all      br0    any     anywhere             anywhere            
    0     0 ACCEPT     all      eth2.2 map0    anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 278 packets, 30774 bytes)
 pkts bytes target     prot opt in     out     source               destination

而流程圖如下


而實際的rule則是找到一個符合的,就會去執行相對應的動作,剩下的rule就不會去管了。

參考資料:
Iptables 指南 1.1.19
Chapter 18. Firewalling
iptables 設定入門
iptables 的用法
iptable使用笔记

2015年2月12日 星期四

送IPv6的RS(Router Solicitation)到指定的interface

IPv6的網路中,
client端會依據RA(Router Advertisement)的封包來設定IPv6 address.
詳情可以參考第十篇 IPv6 Path MTU及Router Advertisement

而RA的發送有兩個時機點,
1. 固定時間發送RA
2. 當收到client端送出RS(Router Solicitation)時,立刻以RA封包回應

現在遇到的問題是,router的發送RA的間隔設定很長的話,而網路又沒有其它client端送出RS封包,如此一來,剛接上去的client端網路要很久後才會被設定,這個是使用者所不能接受的。

因此,現在要嘗試來寫一個user mode的執行檔, 可以讓我針對指定的interface送出RS封包,
在參考busybox的ping6與radvd的source code後,總算完成了。

參考了IPv6 Essentials這本書, 裡面有講到一段話, 非常清楚的說明了RS的條件
「In the IP header of a Router Solicitation message, you will usually see the all-routers multicast address of ff02::2 as a Destination address. The hop limit is set to 255. The ICMP Type field is set to 133, which is the value for the Router Solicitation message. The Code field is unused and set to 0. The following two bytes are used for the Checksum. The next four bytes are unused and reserved for future use. The sender sets them to 0, and the receiver ignores those fields. For a Router Solicitation message, a valid option is the link-layer address of the sending host, if the address of the sending host is known. If the Source address on the IP layer is the unspecified (all-zeros) address, this field is not used. More options may bedefined in future versions of ND. If a host cannot recognize an option, it should ignore the option and process the packet.

Routers that receive this Solicitation message reply with a Router Advertisement message. Routers also issue those messages periodically.」

參考radvd裡面的send_ra
把其改寫成send_rs
但是,結果確把RS封包往LAN port送, 而我是想往WAN port送,
這個時候想到ping6可以指定傳送的介面,例:
# ping6 ff02::2 -I eth2.2

在改寫完後,可以確實的把RS往指定的interface送, 但是,router確不會回傳RA.
在比對完可以正確回傳RA的RS封包與我自己傳送的RS封包後, 跟上面那一段文字比對後,發現有可能是Hop limit我設定為1,
而正常的必需要是255
而這個部分必需要用setsockopt來完成~
int sockopt;
sockopt = 255;
setsockopt(pingsock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &sockopt, sizeof(sockopt));

因為我們要送的是multi-cast的封包, 因為設定的Hop limit也是for multi-cast的,必需使用IPV6_MULTICAST_HOPS
uni-cast則是使用IPV6_UNICAST_HOPS

接下來則是sample code了
這中間使用到if_nametoindex→把eth2.2轉成index

getopt32(argc, argv, "qvc:s:I:", &opt_c, &opt_s, &opt_I);
會連動到option_mask32這一個變數,
當有發現到q則option_mask32的bit 0會被舉起來
當有發現到c的option時, 則option_mask32的bit 2會被舉起來
因-c後面要接參數, 所以opt_c接的是第一個參數

2014年12月9日 星期二

get ip address by DNS

目前要解析DNS去解析IP,
但是gethostbyname並不支援IPv6,
但有找到getaddrinfo可以達到同樣的功能,
而且同時有支援IPv4與IPv6

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
   struct addrinfo hints, *res, *p;
   int status;
   char ipstr[INET6_ADDRSTRLEN];

   if (argc != 2) {
       fprintf(stderr,"usage: showip hostname\n");
       return 1;
   }

   memset(&hints, 0, sizeof hints);
   hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version
   hints.ai_socktype = SOCK_STREAM;

   if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
       fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
       return 2;
   }

   printf("IP addresses for %s:\n\n", argv[1]);

   for(p = res;p != NULL; p = p->ai_next) {
       void *addr;
       char *ipver;

       // get the pointer to the address itself,
       // different fields in IPv4 and IPv6:
       if (p->ai_family == AF_INET) { // IPv4
           struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
           addr = &(ipv4->sin_addr);/*error*/
           ipver = "IPv4";
       } else { // IPv6
           struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
           addr = &(ipv6->sin6_addr);/*error*/
           ipver = "IPv6";
       }

       // convert the IP to a string and print it:
       inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
       printf("  %s: %s\n", ipver, ipstr);
   }

   freeaddrinfo(res); // free the linked list

   return 0;
}

參考資料:
Sample getaddrinfo Code Compiles in Linux but not FreeBSD
getaddrinfo(3) - Linux man page
gethostbyname(), gethostbyaddr()
Porting IPv4 applications to IPv6
Porting IPv6 -- examples

2014年11月17日 星期一

建立samba

因為compiler環境在linux,
而產生出來的image檔案必需要傳到windows上做燒錄的動作。

找了一下,有幾個方式可以完成,
FTP
WEB
網路芳鄰

目前看起來最簡單的方式應該是網路芳鄰samba

在多天的嘗試後,可以正常的使用帳號的方式連線到linux的空間,
可惜的是還沒有辦法試成功可以用匿名的方試登入(Guest)

========== 開始 ==========
0. 查詢是否有安裝samba
rpm -q samba

1. 查詢防火牆的狀態
systemctl status firewalld

2. 關掉防火牆
systemctl disable firewalld
systemctl stop firewalld

3. 新增samba使用者
smbpasswd -a caspar
若遇到以下錯誤訊息,表示系統沒有相對應的帳號。
目前的設置是linux系統有的帳號,samba才可以追加其帳號。

4. 停用samba使用者
smbpasswd -d caspar

5. 刪除samba使用者
smbpasswd -x caspar

6. 啟用samba服務
service smb start

7. 重新啟動samba服務
service smb restart

8. 查詢目前samba的狀態
service smb status

基本上新增samba使用者後,就可以由windows進入,但是,目前成功的方試,仍然要使用帳號跟密碼。

smbpasswd這一個指令可以做一些簡單的使用者帳號的操作,
但是更深入的操作方式就必需要使用pdbedit這一個指令

========== pdbedit 指令說明 ==========
pdbedit -L
列出使用者列表

pdbedit -Lv
列出詳細的使用者列表

pdbedit -Lw
列出同 smbpasswd 格式的使用者列表

pdbedit -a jerry
新增 jerry帳號

pdbedit -x jerry
刪除 jerry帳號

pdbedit -c "[D]" -u jerry
暫時停用 jerry 這個帳號

pdbedit -c "[]" -u jerry
恢復使用 jerry 這個帳號

========== 其它資訊 ==========
linux上登入window或是samba的電腦
smbclient //主機/分享的資料匣資源 -U 使用者名稱
輸入密碼就可以執行類似ftp的指令了

mount 別台機器分享的資源到本台電腦
mount -t smbfs -o username=使用者名稱 ,password=密碼 //主機名稱/分享的資源 /主機目錄

查詢使用的port
netstat -anp

查詢目前執行的程式
ps aux | grep mbd

在設定smb.conf時, 若嘗試要設定Guest登入
設定security為share
會出現以下錯誤
WARNING: Ignoring invalid value 'share' for parameter 'security'
改為以下就可以正常的
security = user
map to guest = Bad User

========== 自己安裝 samba-4.1.13 ==========
./configure
會出現以下錯誤訊息
Could not find the python development headers
安裝以下套解可以解除問題
yum install libacl-devel libblkid-devel gnutls-devel readline-devel python-devel gdb pkgconfig

參考資料:
如何檢查linux中的服務是否正常?
Samba 設定USER等級分享目錄[3]
Samba 下 Ubuntu與Win7共享資料夾設定,利用 host-only網路
Samba-4.1.13
安裝samba系統
fedora 10/11 安裝samba || windows 與 linux 的網芳設定
第十六章、檔案伺服器之二: SAMBA 伺服器

windows 網路指令

arp
可以查詢IP與MAC相對應的列表

arp -s 157.55.85.212 00-aa-00-62-c6-09 .... 新增靜態項目。
arp -a .... 顯示 ARP 表格。

2014年10月30日 星期四

2014年9月10日 星期三

Mapping of Address and Port (MAP)

最近在研究MAP這個東東,
這個東西主要是用來做什麼的呢?

眾所皆知, IPv4 address都已經發完了。
IPv6絕對是未來的方向。

可以想像的,
IPv4未來會成為IPv6網路的孤島。

可能會有總總因素,會讓使用者(client)或服務提供者(server)只能使用IPv4 network的情況,
而如何透過IPv6的網路來傳送IPv4的封包,
就是MAP要做的事情。

而要在IPv6的網路上傳輸,必需要有IPv6 address。
問題是如何把IPv4轉換成IPv6 address。

通常有兩個主要的方式,
stateful, stateless

什麼是stateful呢?
就是在每一個IPv4與IPv6轉換的設備上會有轉換的記錄,
例如:
292.11.45.1→2001:34:55:99:ac::2
292.45.11.3→2001:34:55:99:ac::3
也就是說每當要轉換時,必需由讀取這一個記錄,
才能了解要怎麼轉換。

而stateless則是會有一個演算法,
使得IPv4與IPv6可以直接透過這一個演算法來互相轉換。
一般來說都會比較推薦stateless的方式(原因是什麼我目前還不太清楚)。

而MAP主要分為
Mapping of Address and Port with Encapsulation (MAP-E)

Mapping of Address and Port with Translation (MAP-T).

這兩個主要的差別在於MAP-E是用封裝的方式,
直接在IPv4的封包外再加上IPv6的header,
這樣的好處是可以完整保存IPv4的封包。
但是,要傳送的封包是會比較大一點,因為額外加了IPv6的封包了嘛。

而MAP-T則是把IPv4的header轉換成IPv6的header,
缺點是額外做轉換的動作,
效能來說可能會比較慢一點。

先暫時寫到這裡,
最近一直在研究這個東西,
應該還會持續一段時間。

參考資料:
【自由谈】城域网IPv6过渡技术——MAP技术(1)

2014年9月1日 星期一

linux下停用IPv6

直接寫入1到
/proc/sys/net/ipv6/conf/all/disable_ipv6
就可以關掉整個IPv6的支援。

可以填到
/usr/etc/rcS裡面寫入
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

其它方式可以參考
Linux 下關閉支援 IPv6 提升效能

2014年5月9日 星期五

如何開啟windows 7的telnet與tftp

為了把image燒到測試的板子上面,
必需要用到tftp這一個指令。

而在windows 7預設是把telnet與tftp關掉。

如何把這兩個功能打開呢?

開啟控制台→程式集→開啟或關閉Windows功能



選擇「Telnet用戶端」與「TFTP用戶端」的選擇,
再按確定。



這樣就可以使用telnet與tftp了。

參考資料:
Win7 開啟 telnet and tftp

2014年4月22日 星期二

IPv6的封包傳送的情境

目前正在研究,IPv6封包傳送的方式。

依IPv4的經驗,
當我要傳送出去的目的端位址,
是依目前的route table來判斷,
要送去哪一個介面。

命令提示字元輸入
route print

而要判斷是否為同一個network,則必需要使用到網路位址(IP)與網路遮罩做AND運算元的動作。
例如我要傳送一個封包到192.168.1.89,
則我route table要由下往上看。
先把網路遮罩(255.255.255.255)與192.168.1.89做AND運算元的動作,
255.255.255.255 & 192.168.1.89 = 192.168.1.89
並不與網路目的地255.255.255.255相同,
因此再往上比對上一個。

一直到比對到了倒數第7個,
先把網路遮罩(255.255.255.0)與192.168.1.89做AND運算元的動作,
255.255.255.0 & 192.168.1.89 = 192.168.1.0
與網路目的地192.168.1.0相同,因此會把這一個封包送到介面(192.168.1.100)

而當我要傳送一個封包到168.95.1.1(HiNet DNS),
一樣是由最底下開始比對,
一直到最上面那一筆做運算,
0.0.0.0 & 168.95.1.1 = 0.0.0.0
與網路目的地0.0.0.0相同,因此會把這一個封包送到介面(192.168.1.100)
並且透過把封包傳給Gateway(192.168.1.254)

以上是IPv4的情況。

在IPv6其實是差不多的。

命令提示字元輸入
route print


而要判斷要把封包傳送到哪一個介面,一樣要使用網路目的地這個東東。
而這一個組成結構是IPv6/Prefix
而運算的方式跟IPv4差不多。
若我要傳送資料到目的位址(2001:470:871c:581:bd81:7828:ca57:8888)
prefix是8的意思是說IPv6的128 bit前8bit是1,其餘的都是0。
則把目的位址PrefixAND運算元的動作。
2001:470:871c:581:bd81:7828:ca57:8888 & FF00:: = 2000::
結果並不等於ff00::
因此,再往上尋找。

一直到了到數第10個,
2001:470:871c:581:bd81:7828:ca57:8888 & FFFF:FFFF:FFFF:FFFF:: = 2001:470:871c:581::
結果與網路目的(2001:470:871c:581::)相同,
因此就把封包送到介面16。

若我想把封包送到2001:4860:4860::8888 (Google IPv6 DNS)
一樣是由最底下開始比對,
一直到最上面那一筆做運算,
:: & 2001:4860:4860::8888 = ::
與網路目的地::相同,因此會把這一個封包送到介面16,
並且透過把封包傳給Gateway(fe80::250:18ff:fe22:4491)
而這個fe80::250:18ff:fe22:4491剛好會是router的LAN port的IPv6 Link-Local Address

而若想知道介面代號指的是哪一個介面的話,可以使用下面的指令
netsh interface ipv6 show interface

2014年4月21日 星期一

tracert

在windows下要了解我的封包是如何傳送的,
可以使用tracert這一個指令。

若想知道對方的server是否還活著,
也可以使用ping這一個指令。

2014年4月18日 星期五

如何查詢目前的網路狀態

在windows下要查詢本機端的網路狀態,
最簡單的方式就到「命令提示字元」輸入ipconfig /all指令,
最完整的本機端完路設定就會出現了。

而若要透過視窗的方式表示出來的話,
則依「控制台」→「網路和網際網路」→「網路連線」
對「區域連線」按右鍵,
選擇「狀態」,再選擇「詳細資料」即可。



參考資料:
Windows 7 無法使用分享器上網時,應如何檢查設定?

2014年4月16日 星期三

PackEth

這個東西看起來可以自訂測試封包,
或許之後會用的到!



參考資料:
PackEth for Windows!

2014年3月19日 星期三

Wireshark filter出DHCP封包

透過Wireshark抓DHCP封包。
觀察DHCP packet.

因DHCP是基於bootp協定,所以設定filter為bootp即可。

而若只要單純的抓options是53的話,可以設定
bootp.option.type==53
這樣會把options file有53的濾出來。

參考資料:
How to filter DHCP Traffic with Wireshark
wireshark 只過濾出DHCP封包

2009年8月19日 星期三

SIP (Session Initiation Protocol)

SIP (Session Initiation Protocol)是一個應用層的新的協定,在研究網路handover時,因為SIP也相當支援移動性,進而了解這是一個不錯的協定。

參考資料:
SIP 協定化解 IP 通訊協定之安全疑慮
什麽是RTP - 即時傳輸協定??
SIP architecture

2009年6月5日 星期五

MTU

MTU 為 Maximum Transmission Unit 的縮寫, 一般預設值為 1,500。但是在不同的網路環境中,應該是有不同的數值。以下列出各種 Maximum MTU

EtherNet Used:1,500(一般的預設值)
EtherNet Acutally:1,496(因為1,500比較方便記憶)
PPPoE(撥接 ADSL 用的):1,492
Dial-up(Modem 用的):576

以上所列出的為最大值,但實際上要採用的應該是個別的網路情況來設定,而測試 MTU 值的做法如下(請進入 DOS 模式):

ping -f -l [packetsize] [www.yourisp.com]

[packetsize]:看您是用何種的網路環境,從最大值開始試吧!可用的範圍是 1 ~ 1,500。
[www.yourisp.com]:不限定啦!可以用你的 gateway IP,或是 gateway 之外的任何有效網址或IP。

如果出現了 "Packet needs to be fragmented, but DF set",那就請你把 [packetsize] 的數值減小吧!直到不會出現此一訊息為止。

在此另外說其它的東西。因為此封包(packet)包含了 20 bytes 的 IP header 及 8 bytes 的 ICMP header,所以上面得到的數值加上 28,才是我們要的 Maximum MTU。

MSS 為 Maximum Segment Size 的縮寫,也就是實際傳輸的資料量。他和 MTU 的關係是 MTU = MSS + TCP&IP headers。而 TCP header 及 IP header 的大小均為 20 bytes,所以若是可以最大化的 PPPoE 環境,MTU 值為 1,492, 而我們用 ping 所得出來的數值是 1,492 - 28 = 1,464,而 MSS 為 1,492 - 40 = 1,452。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上是 MTU 的介紹, 現在我們來說明要如何調整. 這必須要用改登錄檔(Registry),而用的工具是 regedit.exe or regedt32.exe (or other third-party programs)。

Win98
先找出你要調整的網路卡是在哪裡,HKEY_Local_Machine\System \CurrentControlSet\Services\Class\NetTrans\000n\,n 為數字 (1 ~ 不定,視您的網路設備數目。),可以從其中IPAddress or IPMask or DefaultGateway......來判斷。

然後在那個機碼內加入 DWOED,並命名為 MaxMTU,然後輸入您剛才所得到的數值(要注意16進位還是10進位喔!)。

Win2K
先找出你要調整的網路卡是在哪裡,HKEY_Local_Machine\SYSTEM\CurrentControlSet\Services \Tcpip\Parameters\Adapters\<interface>,<interface> 為 GUID 碼,進去裡面根據前面所說的,找出您要設定的網路卡之 GUID 碼。

然後在 HKEY_Local_Machine\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<interface> 之下(<interface>為剛剛找出之GUID碼),加入 DWORD,並命名為 MTU,然後輸入您剛才所得到的數值(要注意 16 進位還是 10 進位喔!)。

參考資料:
簡介 MTU 及其調整
MTU 的最佳化

2009年5月25日 星期一

如何使用Sctp的partial reliability

因為要寫一個handover的網路電話,所以必需要知道目前使用的線路可能快要有問題了, 必需要切換線路,其中一個方式就是使用SCTP_SEND_FAILED的這一個事件。

SCTP_SEND_FAILED的介紹
When a message can't be delivered to a peer, the message is sent back to the user through this notification.
This notification is usually soon followed by an association failure notification.

基本上會出現SCTP_SEND_FAILED只有以下兩個情況
1. In most cases, the only way a message will not be delivered is if the association has failed.
只有當目前的這一個association才會顯示SCTP_SEND_FAILED
2. The only time a message failure will occur without an association failure is when the partial reliability extension of SCTP is being used
當有使用partial reliability時,若沒有在限定的時間(TTL[time to live])內送出去的話, 也會觸發SCTP_SEND_FAILED的事件

研究了好久, 總算知道如何使用partial reliability啦~
這裡使用的是one-to-one 的sctp, 也就是tcp style 的sctp,
one-to-many是不是也是一樣的設定方式,目前還不知道

這裡我們把它分為sender端與receiver端
sender端:
1. 在accept後, 要設定由accept回傳的connfd為SCTP_NODELAY, 因為若沒有設定SCTP_NODELAY的話,那麼程式會等收集到一定的量才送出資料,這個時候就會超過TTL的時間才送出去, 就會觸發SCTP_SEND_FAILED的事件啦, 以下的程式片斷
struct sockaddr_in sd;
int connfd;
int flag=1;
socklen_t sdlen = sizeof(sd);
sockfd = ::socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
sctp_sa.sin_family = AF_INET;
sctp_sa.sin_port = htons(1234);
sctp_sa.sin_addr.s_addr = htons("127.0.0.1");

connfd = ::accept(sockfd,(struct sockaddr *) &sd, (socklen_t *)&sdlen);
setsockopt(connfd,IPPROTO_SCTP,SCTP_NODELAY,&flag,sizeof(flag));


2. 在sctp_sendmsg的ttl欄位要加入你要設定的時間, 若是0的話, 則表示沒有限制
ssize_t sctp_sendmsg(int sockfd,const void *msg,size_t msgsz, const struct sockaddr *to,socklen_t tolen,uint32_t ppid, uint32_t flags,uint16_t stream, uint32_t timetolive,uint32_t context);
這裡另外提到,在one-to-one的情況下若to是NULL的話,則會送到目前這一個association的primary address,當to是NULL的話,tolen必需要設定為0

receiver端也有兩點要注意:
1. 要設定要監控sctp_send_failure_event
struct sctp_event_subscribe event;

event.sctp_send_failure_event = 1;
setsockopt(connfd,IPPROTO_SCTP,SCTP_EVENTS,&event,sizeof(event));


2. 由接收到的資料來判斷是否為sctp_send_failure_event事件, 以下是以one-to-one來當作例子

char inputBuffer[1024];
struct sockaddr_in peer,
int msg_flags;
struct sctp_sndrcvinfo sndrcvinfo;
socklen_t peerlen = sizeof(peer);
::sctp_recvmsg(connfd,inputBuffer,sizeof(inputBuffer),(struct sockaddr *) &peer,&peerlen,&sndrcvinfo,&msg_flag);
if (msg_flag & MSG_NOTIFICATION) // 判斷是否為事件, 若成立表示為事件
{
union sctp_notification *snp = (union sctp_notification *) inputBuffer;
switch (snp->sn_header.sn_type)
{
case SCTP_SEND_FAILED:
printf("SCTP_SEND_FAILED\n");
break;
default:
printf("unknow notification\n");
}
}


以上就可以判斷是否有Sendfail的事件啦

2009年5月15日 星期五

修改IHU的configure檔案

因為要加入一些新的class到project裡面,因此,要重新修改Makefile

而這一個Makefile是由autoconf與automake所建立的,因此要修改使得可以建立新的Makefile,但是,因為我不熟autoconf與automake所以,目前還是失敗的,先列出我目前使用的步驟吧~

1. 複製SctpSocketHandler.cpp與SctpSocketHandler.h到src

2. 修改Makefile.am加入SctpSocketHandler.cpp與SctpSocketHandler.h

3. 在Receiver.hpp與Transmitter.hpp加入#include "SctpSocketHandler.h"

4. autoconf
產生configure檔案

5. aclocal
產生aclocal.m4

6. automake --add-missing
產生Makefile.in

7. LIBS=-lsctp ./configure
產生Makefile

8. make
編譯

[2009.05.26 補充]
要在ihu的專案中加入一個具有Q_OBJECT, slots, signals
必需要依以下步驟...
例如要加入Ren.hpp與Ren.cpp
這裡要注意的是, header file一定是要hpp的副檔名
1. 在Makefile.am的ihu_SOURCES加入src/Ren.hpp src/Ren.cpp

2. 同時在Makefile.am的nodist_ihu_SOURCES加入src/moc_Ren.cpp

3. 在configure.ac的AM_INIT_AUTOMAKE改成AM_INIT_AUTOMAKE(Ihu, 1.0)

4. 然後依以上方式執行autoconf;aclocal;automake --add-missing;LIBS=-lsctp ./configure

5. make

[2009.05.28 補充]
為了避免每一次configure均加上LIBS=-lsctp
我們要修改configure.ac檔案加入
下面這一個是加入一個sctp的library
AC_CHECK_LIB(sctp, sctp_recvmsg,, [AC_MSG_ERROR(You have get sctp to build the IHU)])

而下面這一行是檢查header file巨集
AC_CHECK_HEADER

相關autoconf與automake可以參考
【轉貼】自動產生Makefile - autoconf & automake

2009年5月12日 星期二

Ekiga - 網路視訊電話

這一個網路視訊電話的前身是Gnome meeting,是我寄信問之前的「一哥」學長所得知的情報。

當他知道我要把他之前的網路電話加上視訊時,提出了這一個建議,不知道是否用Gnome meeting改成sctp base的會比較快。

看起來是這樣沒有錯,但是,gnome meeting是以gtk來寫介面的,而我之前是使用Qt來寫介面的,很怕到時候會遇到一堆介面上的問題,所以,我還是用IHU來改寫就好了吧~

不過,這裡留下在ubuntu下安裝Ekiga的教學連結
Compile your own SVN version of Ekiga on Ubuntu