亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 37983 | 回復: 68
打印 上一主題 下一主題

Linux網(wǎng)絡(luò)編程一步一步學-IPv6下網(wǎng)絡(luò)編程步驟 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-01-29 13:31 |只看該作者 |倒序瀏覽
大家都知道,隨著互聯(lián)網(wǎng)上主機數(shù)量的增多,現(xiàn)有的32位IP地址已經(jīng)不夠用了,所以推出了下一代IP地址IPv6,寫網(wǎng)絡(luò)程序的要稍微改變一下現(xiàn)有的網(wǎng)絡(luò)程序適應(yīng)IPv6網(wǎng)絡(luò)是相當容易的事。
對于我們來說就是IP地址變化了,所以程序里在用到IP地址的地方做相應(yīng)的改變就可以了。

記。褐饕歉淖兂绦蚶镌O(shè)置IP地址和端口等部分的代碼。

服務(wù)器端源代碼如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <netinet/in.h>
  7. #include <sys/socket.h>
  8. #include <sys/wait.h>
  9. #include <unistd.h>
  10. #include <arpa/inet.h>

  11. #define MAXBUF 1024
  12. /************關(guān)于本文檔********************************************
  13. *filename: ipv6-server.c
  14. *purpose: 演示最基本的IPv6網(wǎng)絡(luò)編程步驟,開啟服務(wù)接收客戶端連接并和客戶端通信,互相收發(fā)消息
  15. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  16. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  17. *date time:2007-01-29 13:06
  18. *Note: 任何人可以任意復制代碼并運用這些文檔,當然包括你的商業(yè)用途
  19. * 但請遵循GPL
  20. *Thanks to:Google
  21. *Hope:希望越來越多的人貢獻自己的力量,為科學技術(shù)發(fā)展出力
  22. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  23. *********************************************************************/

  24. int main(int argc, char **argv)
  25. {
  26.     int sockfd, new_fd;
  27.     socklen_t len;

  28.     /* struct sockaddr_in my_addr, their_addr; */ // IPv4
  29.     struct sockaddr_in6 my_addr, their_addr; // IPv6

  30.     unsigned int myport, lisnum;
  31.     char buf[MAXBUF + 1];

  32.     if (argv[1])
  33.         myport = atoi(argv[1]);
  34.     else
  35.         myport = 7838;

  36.     if (argv[2])
  37.         lisnum = atoi(argv[2]);
  38.     else
  39.         lisnum = 2;

  40.     /* if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { */ // IPv4
  41.     if ((sockfd = socket(PF_INET6, SOCK_STREAM, 0)) == -1) { // IPv6
  42.         perror("socket");
  43.         exit(1);
  44.     } else
  45.         printf("socket created\n");

  46.     bzero(&my_addr, sizeof(my_addr));
  47.     /* my_addr.sin_family = PF_INET; */ // IPv4
  48.     my_addr.sin6_family = PF_INET6;    // IPv6
  49.     /* my_addr.sin_port = htons(myport); */ // IPv4
  50.     my_addr.sin6_port = htons(myport);   // IPv6
  51.     if (argv[3])
  52.         /* my_addr.sin_addr.s_addr = inet_addr(argv[3]); */ // IPv4
  53.         inet_pton(AF_INET6, argv[3], &my_addr.sin6_addr);  // IPv6
  54.     else
  55.         /* my_addr.sin_addr.s_addr = INADDR_ANY; */ // IPv4
  56.         my_addr.sin6_addr = in6addr_any;            // IPv6

  57.     /* if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) */ // IPv4
  58.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in6))  // IPv6
  59.         == -1) {
  60.         perror("bind");
  61.         exit(1);
  62.     } else
  63.         printf("binded\n");

  64.     if (listen(sockfd, lisnum) == -1) {
  65.         perror("listen");
  66.         exit(1);
  67.     } else
  68.         printf("begin listen\n");

  69.     while (1) {
  70.         len = sizeof(struct sockaddr);
  71.         if ((new_fd =
  72.              accept(sockfd, (struct sockaddr *) &their_addr,
  73.                     &len)) == -1) {
  74.             perror("accept");
  75.             exit(errno);
  76.         } else
  77.             printf("server: got connection from %s, port %d, socket %d\n",
  78.                    /* inet_ntoa(their_addr.sin_addr), */ // IPv4
  79.                    inet_ntop(AF_INET6, &their_addr.sin6_addr, buf, sizeof(buf)), // IPv6
  80.                    /* ntohs(their_addr.sin_port), new_fd); */ // IPv4
  81.                    their_addr.sin6_port, new_fd); // IPv6

  82.         /* 開始處理每個新連接上的數(shù)據(jù)收發(fā) */
  83.         bzero(buf, MAXBUF + 1);
  84.         strcpy(buf,
  85.                "這是在連接建立成功后向客戶端發(fā)送的第一個消息\n只能向new_fd這個用accept函數(shù)新建立的socket發(fā)消息,不能向sockfd這個監(jiān)聽socket發(fā)送消息,監(jiān)聽socket不能用來接收或發(fā)送消息\n");
  86.         /* 發(fā)消息給客戶端 */
  87.         len = send(new_fd, buf, strlen(buf), 0);
  88.         if (len < 0) {
  89.             printf
  90.                 ("消息'%s'發(fā)送失敗!錯誤代碼是%d,錯誤信息是'%s'\n",
  91.                  buf, errno, strerror(errno));
  92.         } else
  93.             printf("消息'%s'發(fā)送成功,共發(fā)送了%d個字節(jié)!\n",
  94.                    buf, len);

  95.         bzero(buf, MAXBUF + 1);
  96.         /* 接收客戶端的消息 */
  97.         len = recv(new_fd, buf, MAXBUF, 0);
  98.         if (len > 0)
  99.             printf("接收消息成功:'%s',共%d個字節(jié)的數(shù)據(jù)\n",
  100.                    buf, len);
  101.         else
  102.             printf
  103.                 ("消息接收失!錯誤代碼是%d,錯誤信息是'%s'\n",
  104.                  errno, strerror(errno));
  105.         /* 處理每個新連接上的數(shù)據(jù)收發(fā)結(jié)束 */
  106.     }

  107.     close(sockfd);
  108.     return 0;
  109. }
復制代碼

每行程序后面的 “//IPv4” 表示這行代碼是在IPv4網(wǎng)絡(luò)里用的
而“//IPv6” 表示這行代碼是在IPv6網(wǎng)絡(luò)里用的,比較一下,會很容易看到差別的。

客戶端源代碼如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <resolv.h>
  6. #include <stdlib.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <unistd.h>

  10. #define MAXBUF 1024
  11. /************關(guān)于本文檔********************************************
  12. *filename: ipv6-client.c
  13. *purpose: 演示最基本的IPv6網(wǎng)絡(luò)編程步驟,這是個客戶端程序,與服務(wù)器互相收發(fā)消息
  14. *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)
  15. Linux愛好者 Linux知識傳播者 SOHO族 開發(fā)者 最擅長C語言
  16. *date time:2007-01-29 12:56
  17. *Note: 任何人可以任意復制代碼并運用這些文檔,當然包括你的商業(yè)用途
  18. * 但請遵循GPL
  19. *Thanks to:Google
  20. *Hope:希望越來越多的人貢獻自己的力量,為科學技術(shù)發(fā)展出力
  21. * 科技站在巨人的肩膀上進步更快!感謝有開源前輩的貢獻!
  22. *********************************************************************/
  23. int main(int argc, char **argv)
  24. {
  25.     int sockfd, len;
  26.     /* struct sockaddr_in dest; */ // IPv4
  27.     struct sockaddr_in6 dest;      // IPv6
  28.     char buffer[MAXBUF + 1];

  29.     if (argc != 3) {
  30.         printf
  31.             ("參數(shù)格式錯誤!正確用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用來從某個 IP 地址的服務(wù)器某個端口接收最多 MAXBUF 個字節(jié)的消息",
  32.              argv[0], argv[0]);
  33.         exit(0);
  34.     }
  35.     /* 創(chuàng)建一個 socket 用于 tcp 通信 */
  36.     /* if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { */ // IPv4
  37.     if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {      // IPv6
  38.         perror("Socket");
  39.         exit(errno);
  40.     }
  41.     printf("socket created\n");

  42.     /* 初始化服務(wù)器端(對方)的地址和端口信息 */
  43.     bzero(&dest, sizeof(dest));
  44.     /* dest.sin_family = AF_INET; */  // IPv4
  45.     dest.sin6_family = AF_INET6;     // IPv6
  46.     /* dest.sin_port = htons(atoi(argv[2])); */ // IPv4
  47.     dest.sin6_port = htons(atoi(argv[2]));     // IPv6
  48.     /* if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) { */ // IPv4
  49.     if ( inet_pton(AF_INET6, argv[1], &dest.sin6_addr) < 0 ) {                 // IPv6
  50.         perror(argv[1]);
  51.         exit(errno);
  52.     }
  53.     printf("address created\n");

  54.     /* 連接服務(wù)器 */
  55.     if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
  56.         perror("Connect ");
  57.         exit(errno);
  58.     }
  59.     printf("server connected\n");

  60.     /* 接收對方發(fā)過來的消息,最多接收 MAXBUF 個字節(jié) */
  61.     bzero(buffer, MAXBUF + 1);
  62.     /* 接收服務(wù)器來的消息 */
  63.     len = recv(sockfd, buffer, MAXBUF, 0);
  64.     if (len > 0)
  65.         printf("接收消息成功:'%s',共%d個字節(jié)的數(shù)據(jù)\n",
  66.                buffer, len);
  67.     else
  68.         printf
  69.             ("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",
  70.              errno, strerror(errno));

  71.     bzero(buffer, MAXBUF + 1);
  72.     strcpy(buffer, "這是客戶端發(fā)給服務(wù)器端的消息\n");
  73.     /* 發(fā)消息給服務(wù)器 */
  74.     len = send(sockfd, buffer, strlen(buffer), 0);
  75.     if (len < 0)
  76.         printf
  77.             ("消息'%s'發(fā)送失!錯誤代碼是%d,錯誤信息是'%s'\n",
  78.              buffer, errno, strerror(errno));
  79.     else
  80.         printf("消息'%s'發(fā)送成功,共發(fā)送了%d個字節(jié)!\n",
  81.                buffer, len);

  82.     /* 關(guān)閉連接 */
  83.     close(sockfd);
  84.     return 0;
  85. }
復制代碼


編譯程序用下列命令:
gcc -Wall ipv6-server.c -o ipv6server
gcc -Wall ipv6-client.c -o ipv6client


你自己的主機有IPv6地址嗎?很多人會問,輸入ifconfig命令看一下吧:
eth0      鏈路封裝:以太網(wǎng)  硬件地址 00:14:2A:6D:5B:A5
          inet 地址:192.168.0.167  廣播:192.168.0.255  掩碼:255.255.255.0
          inet6 地址: fe80::214:2aff:fe6d:5ba5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數(shù):1
          接收數(shù)據(jù)包:30507 錯誤:0 丟棄:0 過載:0 幀數(shù):0
          發(fā)送數(shù)據(jù)包:26797 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 發(fā)送隊列長度:1000
          接收字節(jié):31461154 (30.0 MiB)  發(fā)送字節(jié):4472810 (4.2 MiB)
          中斷:185 基本地址:0xe400

lo        鏈路封裝:本地環(huán)回
          inet 地址:127.0.0.1  掩碼:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  躍點數(shù):1
          接收數(shù)據(jù)包:13 錯誤:0 丟棄:0 過載:0 幀數(shù):0
          發(fā)送數(shù)據(jù)包:13 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 發(fā)送隊列長度:0
          接收字節(jié):1178 (1.1 KiB)  發(fā)送字節(jié):1178 (1.1 KiB)


看到“inet6 地址:”這兩行了嗎?后面就是你的IPv6地址
關(guān)于IPv6地址類型,可以參考一下 惠普主頁上的技術(shù)文檔資料“IPv6地址類型”

啟動服務(wù):
./ipv6server 7838 1
或者加上IP地址啟動服務(wù):
./ipv6server 7838 1 fe80::214:2aff:fe6d:5ba5/64

啟動客戶端測試一下:
./ipv6client ::1/128 7838

./ipv6client fe80::214:2aff:fe6d:5ba5/6 7838

[ 本帖最后由 zhoulifa 于 2007-1-29 13:34 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2007-01-29 15:07 |只看該作者
贊一個先!
本人也是搞IPV6的,不過不是開源,在公司做IPV6產(chǎn)品的開發(fā)。編寫了公司ND(鄰居發(fā)現(xiàn))部分的全部代碼。
另外修改了TELNET代碼以適應(yīng)IPV6。
感覺IPV6現(xiàn)在還不很成熟,有興趣的話可以一起交流、學習!

論壇徽章:
0
3 [報告]
發(fā)表于 2007-01-29 15:18 |只看該作者
以前關(guān)注過,不過還是等以后用的時候再繼續(xù)研究吧。

論壇徽章:
0
4 [報告]
發(fā)表于 2007-01-29 17:37 |只看該作者
to universes:
高人!
你有沒有NDP協(xié)議rfc文檔? 還是說NDP目前沒有標準,只是大家各自按自己的協(xié)議在做?
如果有,可否發(fā)一份給我? zhoulifa@gmail.com
先謝謝了!

論壇徽章:
0
5 [報告]
發(fā)表于 2007-01-29 17:49 |只看該作者
這個和windows環(huán)境下有什么不同?

再請教個問題:windows XP環(huán)境下如何獲取本機的IP地址(IPv6的地址)?我試了很多方法,2003下可以,XP卻始終不行~

論壇徽章:
0
6 [報告]
發(fā)表于 2007-01-29 18:13 |只看該作者
LZ你好,我看了你發(fā)的幾個帖子,感覺不錯,建議你整理到一個帖子里面這樣以后查找方便也便于將你的想法系列化.我給你加原創(chuàng)精華,謝謝.

論壇徽章:
0
7 [報告]
發(fā)表于 2007-01-29 23:00 |只看該作者
mark

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
8 [報告]
發(fā)表于 2007-01-29 23:45 |只看該作者
強人

論壇徽章:
0
9 [報告]
發(fā)表于 2007-02-03 21:00 |只看該作者
原帖由 converse 于 2007-1-29 18:13 發(fā)表
LZ你好,我看了你發(fā)的幾個帖子,感覺不錯,建議你整理到一個帖子里面這樣以后查找方便也便于將你的想法系列化.我給你加原創(chuàng)精華,謝謝.


感謝版主!我也想全部發(fā)到這里,但不知道怎樣才能一次發(fā)完全部的,所以只挑了幾個有代表性的放在這里。我原本是一系列“ Linux網(wǎng)絡(luò)編程一步一步學”,共24篇,如下:

• Linux網(wǎng)絡(luò)編程一步一步學-簡單客戶端編寫

  • Linux網(wǎng)絡(luò)編程一步一步學-綁定IP和端口

• Linux網(wǎng)絡(luò)編程一步一步學-循環(huán)讀取服務(wù)器上的數(shù)據(jù)

  • Linux網(wǎng)絡(luò)編程一步一步學-設(shè)置非阻塞方式

  • Linux網(wǎng)絡(luò)編程一步一步學-開啟網(wǎng)絡(luò)監(jiān)聽服務(wù)

• Linux網(wǎng)絡(luò)編程一步一步學-接受客戶端連接請求

• Linux網(wǎng)絡(luò)編程一步一步學-向客戶端發(fā)送消息

  • Linux網(wǎng)絡(luò)編程一步一步學-客戶端和服務(wù)器端互相收發(fā)消息

  • Linux網(wǎng)絡(luò)編程一步一步學-UDP編程介紹

  • Linux網(wǎng)絡(luò)編程一步一步學-UDP方式點對點通訊

• Linux網(wǎng)絡(luò)編程一步一步學-UDP方式廣播通訊

• Linux網(wǎng)絡(luò)編程一步一步學-網(wǎng)絡(luò)廣播、組播與單播

  • Linux網(wǎng)絡(luò)編程一步一步學-UDP組播

  • Linux網(wǎng)絡(luò)編程一步一步學-同步聊天程序

  • Linux網(wǎng)絡(luò)編程一步一步學-異步通訊聊天程序select

  • Linux網(wǎng)絡(luò)編程一步一步學-編寫一個HTTP協(xié)議的目錄瀏覽和文件下載服務(wù)器

• Linux網(wǎng)絡(luò)編程一步一步學-用C自己編寫一個telnet服務(wù)器

• Linux網(wǎng)絡(luò)編程一步一步學-網(wǎng)絡(luò)編程函數(shù)說明-來自“永遠的UNIX”

  • Linux下上網(wǎng)方法總結(jié)

• Linux網(wǎng)絡(luò)編程一步一步學-利用OpenSSL提供的SSL操作函數(shù)進行加密通訊原始例子

  • Linux網(wǎng)絡(luò)編程一步一步學-IPv6下網(wǎng)絡(luò)編程步驟

  • Linux網(wǎng)絡(luò)編程一步一步學-HTTPS客戶端程序示例

• OpenSSL體系下使用密鑰數(shù)字證書等

• Linux網(wǎng)絡(luò)編程一步一步學-epoll同時處理海量連接的代碼  編寫一個服務(wù)器同時處理上萬的網(wǎng)絡(luò)連接,這對大量用戶同時在線的編程相當重要。

• Linux網(wǎng)絡(luò)編程一步一步學-加密通訊協(xié)議SSL研究 這對銀行、證券等行業(yè)來說相當重要

•  Linux網(wǎng)絡(luò)編程一步一步學-select詳解

還請告訴我如何將此全部發(fā)到這里。

[ 本帖最后由 zhoulifa 于 2007-2-3 21:09 編輯 ]

論壇徽章:
0
10 [報告]
發(fā)表于 2007-02-03 22:32 |只看該作者
>>還請告訴我如何將此全部發(fā)到這里。
汗,你就把帖子一個一個的貼在這個帖子里面就好了,我敢打賭會N熱門的~~
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP