2009年2月5日 星期四

socket - sctp

成功大學多媒體行動實驗室 有做出以下的產品耶 SCTP-MOVIDEO Server

要使用sctp必需先安裝sctp套件
$ sudo apt-get install libsctp-dev

在寫一個簡單的sctp的server-client出現以下錯誤
ren@notebook:~/svn/renyang-learn/socket/sctp/ftp/test$ gcc -c copy_clinet.c -o copy_clinet.o
In file included from copy_clinet.c:7:
/usr/include/netinet/in.h:84: 錯誤: expected identifier before numeric constant

找了很久,測了很久,才發現header file的擺放順序有問題!!?
若是下面順序的話,就會出現以上錯誤!
#include <sys/socket.h>
#include <netinet/sctp.h>
#include <netinet/in.h>

而以下就可以過
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>

這真是太神奇啦~

在編譯serv.c時會出現以下錯誤
ren@notebook:~/Desktop/homework$ gcc serv.c -o serv
/tmp/ccwbUY4s.o: In function `main':
serv.c:(.text+0x1eb): undefined reference to `sctp_sendmsg'
collect2: ld returned 1 exit status

解決方法:多加一個 -lsctp 的參數
ren@notebook:~/Desktop/homework$ gcc serv.c -lsctp -o serv

ren@notebook:~/svn/renyang-learn/socket/sctp/one-to-many$ make
gcc -Wall -O2 -c client.c -o client.o
client.c: In function 'main':
client.c:33: warning: implicit declaration of function 'inet_pton'
client.c:38: warning: implicit declaration of function 'close'

表示inet_pton與close函式的header file沒有正確的被include進來
分別要include arpa/inet.h和unistd.h

ren@notebook:~/svn/renyang-learn/socket/sctp/ftp$ make
gcc -c client.c -o client.o
In file included from client.c:4:
/usr/include/netinet/in.h:84: 錯誤: expected identifier before numeric constant
make: *** [client.o] Error 1

表示有重覆include in.h之類的

inet_pton函數:將點分十進位串轉換成網路位元組序二進位值,此函數對IPv4位址和IPv6位址都能處理。
#include <arpa/inet.h>
int inet_pton(int family,const char * strptr,void * addrptr);
返回:1---成功 0---輸入不是有效的表達格式 -1---失敗

strtol(將字符串轉換成長整型數)
表頭文件:#include <stdlib.h>
定義函數:long int strtol(const char *nptr,char **endptr,int base);
函數說明:strtol()會將參數nptr字符串根據參數base來轉換成長整型數。參數base範圍從2至36,或0。參數base代表採用的進制方式,如 base值為10則採用10進制,若base值為16則採用16進制等。當base值為0時則是採用10進制做轉換,但遇到如'0x'前置字符則會使用 16進制做轉換。一開始strtol()會掃描參數nptr字符串,跳過前面的空格字符,直到遇上數字或正負符號才開始做轉換,再遇到非數字或字符串結束時('\0')結束轉換,並將結果返回。若參數endptr不為NULL,則會將遇到不合條件而終止的nptr中的字符指針由endptr返回。
返回值:返回轉換後的長整型數,否則返回ERANGE並將錯誤代碼存入errno中。
附加說明:ERANGE指定的轉換字符串超出合法範圍。
參考網站

參考資料:
SCTP Programmer's Guide
Stream Control Transmission Protocol (SCTP)
IBM SCTP socket API
SCTP Programmer's Guide: HP
以IPv6有線/無線網路Multihome-based SCTP通訊協定實作之可切換式多媒體視訊串流平台
一些sctp的文章
我國IPv6建置發展計畫
The Stream Control Transmission Protocol(SCTP) Research and simulation Page
程式資料
Linux C編程---網路編程

SCTP相關網站:
傳輸層:TCP、UDP 和 SCTP
lksctp Project
Quick HOWTO : Ch15 : Linux FTP Server Setup
使用 SCTP 優化網路
Linux Kernel SCTP
Stream Control Transmission Protocol
Solaris(TM) Stream Control Transmission Protocol (SCTP)
Better networking with SCTP
SCTP Features

沒有留言: