1. 程式人生 > >IPv6下網路程式設計例項

IPv6下網路程式設計例項

一、TCP socket ipv6與ipv4的區別

伺服器端原始碼如下:

  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. int main(int argc, char **argv)  
  13. {  
  14.     int sockfd, new_fd;  
  15.     socklen_t len;  
  16.     /* struct sockaddr_in my_addr, their_addr; */// IPv4
  17.     struct sockaddr_in6 my_addr, their_addr; // IPv6
  18.     unsigned int myport, lisnum;  
  19.     char buf[MAXBUF + 1];  
  20.     if (argv[1])  
  21.         myport = atoi(argv[1]);  
  22.     else
  23.         myport = 7838;  
  24.     if (argv[2])  
  25.         lisnum = atoi(argv[2]);  
  26.     else
  27.         lisnum = 2;  
  28.     /* if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { */// IPv4
  29.     if ((sockfd = socket(PF_INET6, SOCK_STREAM, 0)) == -1) { // IPv6
  30.         perror("socket"
    );  
  31.         exit(1);  
  32.     } else
  33.         printf("socket created/n");  
  34.     bzero(&my_addr, sizeof(my_addr));  
  35.     /* my_addr.sin_family = PF_INET; */// IPv4
  36.     my_addr.sin6_family = PF_INET6;    // IPv6
  37.     /* my_addr.sin_port = htons(myport); */// IPv4
  38.     my_addr.sin6_port = htons(myport);   // IPv6
  39.     if (argv[3])  
  40.         /* my_addr.sin_addr.s_addr = inet_addr(argv[3]); */// IPv4
  41.         inet_pton(AF_INET6, argv[3], &my_addr.sin6_addr);  // IPv6
  42.     else
  43.         /* my_addr.sin_addr.s_addr = INADDR_ANY; */// IPv4
  44.         my_addr.sin6_addr = in6addr_any;            // IPv6
  45.     /* if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) */// IPv4
  46.     if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in6))  // IPv6
  47.         == -1) {  
  48.         perror("bind");  
  49.         exit(1);  
  50.     } else
  51.         printf("binded/n");  
  52.     if (listen(sockfd, lisnum) == -1) {  
  53.         perror("listen");  
  54.         exit(1);  
  55.     } else
  56.         printf("begin listen/n");  
  57.     while (1) {  
  58.         len = sizeof(struct sockaddr);  
  59.         if ((new_fd =  
  60.              accept(sockfd, (struct sockaddr *) &their_addr,  
  61.                     &len)) == -1) {  
  62.             perror("accept");  
  63.             exit(errno);  
  64.         } else
  65.             printf("server: got connection from %s, port %d, socket %d/n",  
  66.                    /* inet_ntoa(their_addr.sin_addr), */// IPv4
  67.                    inet_ntop(AF_INET6, &their_addr.sin6_addr, buf, sizeof(buf)), // IPv6
  68.                    /* ntohs(their_addr.sin_port), new_fd); */// IPv4
  69.                    their_addr.sin6_port, new_fd); // IPv6
  70.         /* 開始處理每個新連線上的資料收發 */
  71.         bzero(buf, MAXBUF + 1);  
  72.         strcpy(buf,  
  73.                "這是在連線建立成功後向客戶端傳送的第一個訊息/n只能向new_fd這個用accept函式新建立的socket發訊息,不能向sockfd這個監聽socket傳送訊息,監聽socket不能用來接收或傳送訊息/n");  
  74.         /* 發訊息給客戶端 */
  75.         len = send(new_fd, buf, strlen(buf), 0);  
  76.         if (len < 0) {  
  77.             printf  
  78.                 ("訊息'%s'傳送失敗!錯誤程式碼是%d,錯誤資訊是'%s'/n",  
  79.                  buf, errno, strerror(errno));  
  80.         } else
  81.             printf("訊息'%s'傳送成功,共傳送了%d個位元組!/n",  
  82.                    buf, len);  
  83.         bzero(buf, MAXBUF + 1);  
  84.         /* 接收客戶端的訊息 */
  85.         len = recv(new_fd, buf, MAXBUF, 0);  
  86.         if (len > 0)  
  87.             printf("接收訊息成功:'%s',共%d個位元組的資料/n",  
  88.                    buf, len);  
  89.         else
  90.             printf  
  91.                 ("訊息接收失敗!錯誤程式碼是%d,錯誤資訊是'%s'/n",  
  92.                  errno, strerror(errno));  
  93.         /* 處理每個新連線上的資料收發結束 */
  94.     }  
  95.     close(sockfd);  
  96.     return 0;  
  97. }  
每行程式後面的 “//IPv4” 表示這行程式碼是在IPv4網路裡用的
而“//IPv6” 表示這行程式碼是在IPv6網路裡用的,比較一下,會很容易看到差別的。
客戶端原始碼如下:
  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. int main(int argc, char **argv)  
  12. {  
  13.     int sockfd, len;  
  14.     /* struct sockaddr_in dest; */// IPv4
  15.     struct sockaddr_in6 dest;      // IPv6
  16.     char buffer[MAXBUF + 1];  
  17.     if (argc != 3) {  
  18.         printf  
  19. 相關推薦

    IPv6網路程式設計例項

    一、TCP socket ipv6與ipv4的區別 伺服器端原始碼如下: #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h>

    JNI入門教程1---Android studio JNI程式設計例項並生成so庫

    參考地址: https://www.cnblogs.com/jymblog/p/5526865.html                   https://www.jianshu.com/p/a

    解決Linux網路程式設計(sendto send )出現 SIGPIPE 訊號導致程式異常終止的問題

    引言 最近在Linux下網路程式設計時,出現SIGPIPE 訊號導致程式異常終止,本文記錄下解決的方法以及相應的知識。 SIGPIPE 訊號資料 什麼時候出現此訊號,APUE中有關此訊號的解釋如下: Linux man手冊有關此訊號的解釋: man 7 signal SI

    java socket網路程式設計例項程式碼(含服務端和客戶端)

    本程式碼為java socket網路程式設計例項程式碼,包括客戶端和服務端,實現客戶端傳送訊息,服務端接收並反饋訊息。 server.java為服務端程式碼。 client.java為客戶端程式碼。 服務端程式碼server.java: package socket;

    linux環境網路程式設計

      參考 https://www.cnblogs.com/diligenceday/p/6241021.html https://blog.csdn.net/baidu_36649389/article/details/79081770 http://www.cnblogs

    Linuxshell程式設計例項

    1.用while語句建立一個根據輸入的數值求累加和(1+2+3+。。。。+n)的shell程式。   while           若干個命令列1        do              若干個命令列2        done    結構 #! /bin/b

    QT網路程式設計例項

    最終效果圖: -------------------------------------------------------------------------------------------------------- 注意:建好工程後在“.pro”檔案中加上“Qt

    總結之linux網路程式設計

    1.有一篇好的文章,對Linux下socket程式設計的原理和要點說的很清楚: 2.一些windows網路程式設計的要點吧。包括大頭序,小頭序,網路位元組序。一些常用的函式等。。 3.《linux網路程式設計》宋斌寫的,這本書不錯。寫的清楚,容易懂。是一個比較好的參

    linux 網路程式設計結構體定義對應的標頭檔案

    netinet/if_ether.h   ether_arp的資料結構 netinet/ether.h    以太禎的網路位元組和ascii位元組的轉換,包括ether_ntoa(),ether_aton這樣的函式定義 netinet/ip.h   這個標頭檔案和linux/ip.h似乎很相似,也有iphd

    UDP windowssocket程式設計例項

    Server 端程式原始碼: #include <stdio.h> #include <Winsock2.h> void main() { SOCKET socket1; //InitWinsock();  WSADATA wsaData;     int iErrorCode;   

    linux網路程式設計

    Linux的SOCKET程式設計詳解 1. 網路中程序之間如何通訊 進 程通訊的概念最初來源於單機系統。由於每個程序都在自己的地址範圍內執行,為保證兩個相互通訊的進 程之間既互不干擾又協調一致工作,作業系統為程序通訊提供了相應設施,如 UNIX

    linuxc程式設計例項

    linux下c程式設計使用gcc編譯器,下載gcc:sudo yum install -b gcc current 編寫程式 一、最簡單的helloword vi hello.c #include <stdio.h> int main() {     print

    (筆記)Linux網路程式設計,採用TCP協議實現的C/S架構

    TCP/UDP介紹 TCP(Transfer Control Protocol)傳輸控制協議是一種面向連線的協議, 當我們的網路程式使用這個協議的時候,可以保證我們的客戶端和服務端的通訊是可靠的,安全的,適合於傳輸大批量資料的情況. UDP(User Da

    Linux網路程式設計之自定義協議進行併發多客戶端與伺服器的通訊(多程序處理併發)不足佔用資源太多

    自定義協議訊息體*********msg.h*************#ifndef _MSG_H_#define _MSG_H_struct msg{ char head[10]; //頭部 char msg_chck; //效驗碼 char buff[512];/

    Linux C 網路程式設計之 多執行緒通訊 例項

    簡單示例,有不對的地方,歡迎指點。 伺服器端 /* ============================================================================ Name : sockThreadServer

    網路程式設計基礎【day08】:簡單socket例項(二)

    本節內容 1、概述 2、socket例項 3、總結 一、概述   之前我們只是介紹了soket的概念和一些邏輯圖表,下面我們來看看,socket的客戶端和服務端到底是怎麼用的? 二、socket例項 2.1 客戶端 2.1.1 客戶端程式碼邏輯圖 2.1.2 客戶端程式碼

    Linux網路socket程式設計——實現伺服器(select)與多個客戶端通訊

    Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

    Qt:Qt實現Winsock網路程式設計—非阻塞模式的簡單遠端控制的開發(WSAAsyncSelect)

    Qt實現Winsock網路程式設計—非阻塞模式下的簡單遠端控制的開發(WSAAsyncSelect) 前言 這邊部落格應該是 Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 的姐妹篇,上篇部落格中的socket通訊中所用的Windows api函式 都是

    c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

    c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

    原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大