coTurn是一個開源的STUN和TURN及ICE服務項目,只是不支持Windows。
為了在window平台上使用coTurn源碼,需要在windows平台下安裝Cygwin環境,並編譯coTurn源碼,使其可以運行在windows平台上。
步驟:
1、安裝Cygwin,地址:https://cygwin.com/install.html,按照其說明進行安裝。參照說明地址:https://cygwin.com/cygwin-ug-net/cygwin-ug-net.html
安裝過程中選擇的鏡像源地址,為了更加快速,使用http://mirrors.163.com/cygwin/
2、下載coTurn源碼。目前Release最新版本的地址為:https://codeload.github.com/coturn/coturn/zip/4.5.0.4
3、編譯:
XII. MS Windows and Cygwin support
Currently, this project cannot be compiled under MS Windows.
As the project is using fairly straightforward *NIX API, it is supported
under Cygwin environment in MS Windows.
One note for Cygwin users: we recommended libevent2 installation from the cygwin
"ports" site: http://sourceware.org/cygwinports/ . You will have to install
libevent2 runtime and libevent-devel packages. "Manual" libevent2 compilation
and installation in Cygwin is not recommended and does not garantee a good
outcome.
編譯過程簡單記錄:
①生成Makefile文件
CC=gcc ./configure

1 Dev@Dev-PC /bin/coturn-4.5.0.4 2 $ CC=gcc ./configure 3 install 是 /usr/bin/install 4 pkill 是 /usr/bin/pkill 5 sqlite3 是 /usr/bin/sqlite3 6 Use TMP dir /var/tmp 7 Compiler: gcc 8 Library option -lsocket cannot be used 9 CYGWIN ? 10 Library option -lwldap64 cannot be used 11 Library option -lnsl cannot be used 12 Sockets code is fine: no sin_len field present 13 Ignore IP_RECVERR 14 Crypto SSL lib found. 15 SSL lib found. 16 Libevent2 development found. 17 Libevent2 runtime found. 18 Libevent2 runtime 'extra' found. 19 Libevent2 openssl found. 20 Libevent2 pthreads found. 21 SQLite library found. 22 SQLite development found. 23 PostgreSQL found. 24 MySQL found. 25 26 MONGODB DEVELOPMENT LIBRARIES (libmongoc-1.0 and libbson-1.0) AND/OR HEADER (mongoc.h) 27 ARE NOT INSTALLED PROPERLY ON THIS SYSTEM. 28 THAT'S OK BUT THE TURN SERVER IS BUILDING WITHOUT MONGODB SUPPORT. 29 30 31 HIREDIS DEVELOPMENT LIBRARY (libhiredis.*) AND/OR HEADERS (hiredis/*.h) 32 ARE NOT INSTALLED PROPERLY ON THIS SYSTEM. 33 THAT'S OK BUT THE TURN SERVER IS BUILDING WITHOUT REDIS SUPPORT. 34 35 PREFIX=/usr/local LOCALSTATEDIR=/usr/local/var OSLIBS= -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib DBLIBS= -lsqlite3 -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -L/usr/lib/postgresql -lpq -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -L/usr/lib/mysql -lmysqlclient OSCFLAGS=-g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb DBCFLAGS= -I/usr/local/pgsql/include -I/usr/local/include/pgsql/ -I/usr/local/include/postgres/ -I/usr/local/postgres/include/ -I/usr/local/include/postgresql/ -I/usr/local/postgresql/include/ -I/usr/local/pgsql/include -I/usr/local/include/pgsql/ -I/usr/local/include/postgres/ -I/usr/local/postgres/include/ -I/usr/local/include/postgresql/ -I/usr/local/postgresql/include/ -I/usr/pgsql/include -I/usr/include/pgsql/ -I/usr/include/postgres/ -I/usr/postgres/include/ -I/usr/include/postgresql/ -I/usr/postgresql/include/ -I/usr/local/mysql/include -I/usr/local/include/mysql/ -I/usr/local/mysql/include -I/usr/local/include/mysql/ -I/usr/mysql/include -I/usr/include/mysql/ 36 Makefile created: success.
②編譯make

Dev@Dev-PC /bin/coturn-4.5.0.4 $ make mkdir -p build/obj gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ -c src/client/ns_turn_ioaddr.c -o build/obj/ns_turn_ioaddr.o mkdir -p build/obj gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ -c src/client/ns_turn_msg_addr.c -o build/obj/ns_turn_msg_addr.o mkdir -p build/obj gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ -c src/client/ns_turn_msg.c -o build/obj/ns_turn_msg.o mkdir -p lib ar -r lib/libturnclient.a build/obj/ns_turn_ioaddr.o build/obj/ns_turn_msg_addr.o build/obj/ns_turn_msg.o ar: 正在創建 lib/libturnclient.a pwd /bin/coturn-4.5.0.4 mkdir -p bin gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ src/apps/stunclient/stunclient.c src/apps/common/apputils.c src/apps/common/ns_turn_utils.c src/apps/common/stun_buffer.c -o bin/turnutils_stunclient -Llib -lturnclient -Llib -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib pwd /bin/coturn-4.5.0.4 mkdir -p bin gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ src/apps/rfc5769/rfc5769check.c src/apps/common/apputils.c src/apps/common/ns_turn_utils.c src/apps/common/stun_buffer.c -o bin/turnutils_rfc5769check -Llib -lturnclient -Llib -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib mkdir -p bin gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ src/apps/uclient/uclient.c src/apps/uclient/startuclient.c src/apps/uclient/mainuclient.c src/apps/common/apputils.c src/apps/common/ns_turn_utils.c src/apps/common/stun_buffer.c -o bin/turnutils_uclient -Llib -lturnclient -Llib -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib mkdir -p bin rm -rf bin/turnadmin gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ -I/usr/local/pgsql/include -I/usr/local/include/pgsql/ -I/usr/local/include/postgres/ -I/usr/local/postgres/include/ -I/usr/local/include/postgresql/ -I/usr/local/postgresql/include/ -I/usr/local/pgsql/include -I/usr/local/include/pgsql/ -I/usr/local/include/postgres/ -I/usr/local/postgres/include/ -I/usr/local/include/postgresql/ -I/usr/local/postgresql/include/ -I/usr/pgsql/include -I/usr/include/pgsql/ -I/usr/include/postgres/ -I/usr/postgres/include/ -I/usr/include/postgresql/ -I/usr/postgresql/include/ -I/usr/local/mysql/include -I/usr/local/include/mysql/ -I/usr/local/mysql/include -I/usr/local/include/mysql/ -I/usr/mysql/include -I/usr/include/mysql/ -DTURN_NO_MONGO -DTURN_NO_HIREDIS src/apps/relay/ns_ioalib_engine_impl.c src/apps/relay/turn_ports.c src/apps/relay/http_server.c -Ilib src/apps/relay/mainrelay.c src/apps/relay/netengine.c src/apps/relay/libtelnet.c src/apps/relay/turn_admin_server.c src/apps/relay/userdb.c src/apps/relay/tls_listener.c src/apps/relay/dtls_listener.c src/apps/common/hiredis_libevent2.c src/apps/relay/dbdrivers/dbdriver.c src/apps/relay/dbdrivers/dbd_sqlite.c src/apps/relay/dbdrivers/dbd_pgsql.c src/apps/relay/dbdrivers/dbd_mysql.c src/apps/relay/dbdrivers/dbd_mongo.c src/apps/relay/dbdrivers/dbd_redis.c src/apps/common/apputils.c src/apps/common/ns_turn_utils.c src/apps/common/stun_buffer.c src/client/ns_turn_ioaddr.c src/client/ns_turn_msg_addr.c src/client/ns_turn_msg.c src/server/ns_turn_allocation.c src/server/ns_turn_maps_rtcp.c src/server/ns_turn_maps.c src/server/ns_turn_server.c -o bin/turnserver -lsqlite3 -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -L/usr/lib/postgresql -lpq -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -L/usr/lib/mysql -lmysqlclient -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib cd bin; ln -s turnserver turnadmin mkdir -p bin gcc -g -Wall -Wno-deprecated-declarations -Wextra -Wformat-security -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -I/usr/local/include -I/usr/local/include/ -I/usr/local/include -DTURN_HAS_DAEMON -DINSTALL_PREFIX=/usr/local -DTURNDB=/usr/local/var/db/turndb -Isrc -Isrc/apps/common -Isrc/server -Isrc/client -Isrc/client++ -I/usr/local/include/ -I/usr/local/include/ src/apps/peer/mainudpserver.c src/apps/peer/udpserver.c src/apps/common/apputils.c src/apps/common/ns_turn_utils.c src/apps/common/stun_buffer.c -o bin/turnutils_peer -Llib -lturnclient -Llib -L/usr/local/lib/ -L/usr/local/lib/ -lrt -lwldap32 -lintl -lresolv -lcrypto -lssl -levent_core -levent_extra -levent_openssl -levent_pthreads -lsqlite3 -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/local/lib/ -Wl,-rpath,/usr/lib/postgresql -Wl,-rpath,/usr/lib/mysql -Wl,-rpath,/usr/local/lib rm -rf include mkdir -p include/turn/client cp -pf src/client/*.h include/turn/client/ cp -pf src/client++/*.h include/turn/client/ cp -pf src/ns_turn_defs.h include/turn/ install -d sqlite rm -rf sqlite/turndb sqlite3 sqlite/turndb < turndb/schema.sql
③make install

1 Dev@Dev-PC /bin/coturn-4.5.0.4 2 $ make install 3 install -d /usr/local 4 install -d /usr/local/bin 5 install -d /usr/local/var/db 6 install -d /usr/local/man/man1 7 install -d /usr/local/etc 8 install -d /usr/local/lib 9 install -d /usr/local/share/examples/turnserver 10 install -d /usr/local/share/doc/turnserver 11 install -d /usr/local/share/turnserver 12 install -d /usr/local/include/turn 13 install bin/turnserver /usr/local/bin 14 install bin/turnadmin /usr/local/bin 15 install bin/turnutils_uclient /usr/local/bin 16 install bin/turnutils_peer /usr/local/bin 17 install bin/turnutils_stunclient /usr/local/bin 18 install man/man1/turnserver.1 /usr/local/man/man1/ 19 install man/man1/turnadmin.1 /usr/local/man/man1/ 20 install man/man1/turnutils.1 /usr/local/man/man1/ 21 install man/man1/turnutils_uclient.1 /usr/local/man/man1/ 22 install man/man1/turnutils_stunclient.1 /usr/local/man/man1/ 23 install man/man1/turnutils_peer.1 /usr/local/man/man1/ 24 install man/man1/coturn.1 /usr/local/man/man1/ 25 install lib/libturnclient.a /usr/local/lib 26 install LICENSE /usr/local/share/doc/turnserver 27 install README.turnserver /usr/local/share/doc/turnserver 28 install README.turnadmin /usr/local/share/doc/turnserver 29 install README.turnutils /usr/local/share/doc/turnserver 30 install INSTALL /usr/local/share/doc/turnserver 31 install postinstall.txt /usr/local/share/doc/turnserver 32 install turndb/schema.sql /usr/local/share/doc/turnserver 33 install turndb/schema.sql /usr/local/share/turnserver 34 install turndb/schema.mongo.sh /usr/local/share/doc/turnserver 35 install turndb/schema.mongo.sh /usr/local/share/turnserver 36 install turndb/testredisdbsetup.sh /usr/local/share/turnserver 37 install turndb/testmongosetup.sh /usr/local/share/turnserver 38 install turndb/testsqldbsetup.sql /usr/local/share/turnserver 39 install turndb/schema.userdb.redis /usr/local/share/doc/turnserver 40 install turndb/schema.userdb.redis /usr/local/share/turnserver 41 install turndb/schema.stats.redis /usr/local/share/doc/turnserver 42 install turndb/schema.stats.redis /usr/local/share/turnserver 43 if [ -f sqlite/turndb ] ; then install sqlite/turndb /usr/local/var/db/turndb; fi 44 install examples/etc/turnserver.conf /usr/local/etc/turnserver.conf.default 45 cp -rpf examples/etc /usr/local/share/examples/turnserver 46 cp -rpf examples/scripts /usr/local/share/examples/turnserver 47 rm -rf /usr/local/share/examples/turnserver/scripts/rfc5769.sh 48 cp -rpf include/turn/client /usr/local/include/turn 49 install include/turn/ns_turn_defs.h /usr/local/include/turn 50 cat /usr/local/share/doc/turnserver/postinstall.txt 51 ================================================================== 52 53 1) If you system supports automatic start-up system daemon services, 54 the, to enable the turnserver as an automatically started system 55 service, you have to: 56 57 a) Create and edit /etc/turnserver.conf or 58 /usr/local/etc/turnserver.conf . 59 Use /usr/local/etc/turnserver.conf.default as an example. 60 61 b) For user accounts settings: set up SQLite or PostgreSQL or 62 MySQL or MongoDB or Redis database for user accounts. 63 Use /usr/local/share/turnserver/schema.sql as SQL database schema, 64 or use /usr/local/share/turnserver/schema.userdb.redis as Redis 65 database schema description and/or 66 /usr/local/share/turnserver/schema.stats.redis 67 as Redis status & statistics database schema description. 68 69 If you are using SQLite, the default database location is in 70 /var/db/turndb or in /usr/local/var/db/turndb or in /var/lib/turn/turndb. 71 72 c) add whatever is necessary to enable start-up daemon for the 73 /usr/local/bin/turnserver. 74 75 2) If you do not want the turnserver to be a system service, 76 then you can start/stop it "manually", using the "turnserver" 77 executable with appropriate options (see the documentation). 78 79 3) To create database schema, use schema in file 80 /usr/local/share/turnserver/schema.sql. 81 82 4) For additional information, run: 83 84 $ man turnserver 85 $ man turnadmin 86 $ man turnutils 87 88 ==================================================================
下載tar.gz包的編譯方法:
1 $ tar vfzx coturn-4.5.0.4.tar.gz 2 $ cd coturn-4.5.0.4/ 3 4 $ ./configure 5 6 Dev@Dev-PC /home/coturn-4.5.0.4 7 $ make 8 9 $ make install
4、配置
在bin目錄下生成六個可執行文件
turnadmin turnutils_peer.exe turnutils_stunclient.exe turnserver.exe turnutils_rfc5769check.exe turnutils_uclient.exe
turnserver.exe 就是我們需要的服務器.
turnadmin 用來管理賬戶.
turnutils_stunclient.exe 用於測試stun服務
turnutils_uclient.exe 用於測試turn服務. 模擬多個UDP,TCP,TLS or DTLS 類型的客戶端
example 目錄主要是示范如何配置和使用turn. 包含一些測試用例.
example/etc 下是pem證書和conf配置文件
example/var/db 下是sqlite的db庫. 用於示范數據庫的格式.
coturn 支持三種配置. 命令行, conf文件和數據庫.
數據庫支持sqlite, mysql, postgresql, MongoDB, redis.目前測試的Cygwin環境下編譯的coTurn不支持MongoDB和redis,因為暫時用不到,所以也就沒有查找如何才能編譯支持到上述數據庫
更具體的說明可以看源碼目錄下的README.turnserver README.turnadmin README.turnutils
examples\scripts 下一些測試用例:
loadbalance 示范如何進行負載均衡. 設置一個master turn server 然后配置若干個slave turn server.
longtermsecure 示范如何使用long-term 驗證
longtermsecuredb 與 longtermsecure 類似, 不過是從數據庫配置
shorttermsecure 示范如何使用short-term驗證.
restapi 示范了web方面的使用.
stun 定義了兩種驗證方式.
Long-Term Credential
Short-Term Credential
具體可以參考stun標准 http://tools.ietf.org/html/rfc5389#section-15.4
若用於WebRTC,必須使用long-term
簡單配置:
turnserver -o -a -f -v --mobility -m 10 --max-bps=100000 --min-port=32355 --max-port=65535 --user=ling:ling1234 --user=ling2:ling1234 -r demo
-m 10 表示啟動十個relay線程.
--max-bps=100000 限制最大速度為100KB/s.
添加了兩個用戶ling 和ling2.
可以直接使用turnutils_uclient -u ling -w ling1234 來測試. turnutils_uclient 有很多參數可以配置的.
1
2
3
4
5
|
webrtc::PeerConnectionInterface::IceServer turnServer;
turnServer.uri = "turn:ip";
turnServer.username = "ling";
turnServer.password = "ling1234";
servers.push_back(turnServer);
|
c++ webrtc中可以這樣配置turn. web/android/ios 也是類似的.
如果從安全性方面考慮. 可以為賬戶生成key, 這樣就可以直接通過key登錄. 而不需要提供密碼.
key 通過turnadmin生成, 需要(username, password, realm) . realm是啟動turn server時-r 參數指定的.
例如這樣:
1
2
|
turnadmin -k -u ling -p ling1234 -r demo
0xccba8f3a6a025a38eb4a0e795fc92705
|
參考原文:
https://www.webrtc-experiment.com/docs/TURN-server-installation-guide.html#windows
https://www.slideshare.net/amiteshawa/web-rtc-media-stra
其它:
http://www.cppblog.com/tianhongye/archive/2015/01/15/209524.html
http://www.cnblogs.com/lingdhox/p/4209659.html
http://www.ietf.org/proceedings/87/slides/slides-87-behave-10.pdf
TURN REST Server API ,這個PDF 描述了 turn服務器和客戶端的交互流程.