TCP socket ipv6與ipv4的區別

2021-07-13 05:50:21 字數 4585 閱讀 5178

一、tcp socket ipv6與ipv4的區別

伺服器端源**如下:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define maxbuf 1024

intmain(

intargc, 

char

**argv)  

else

printf("socket created/n"

);  

bzero(&my_addr, sizeof

(my_addr));  

/* my_addr.sin_family = pf_inet; */

// ipv4

my_addr.sin6_family = pf_inet6;    // ipv6

/* my_addr.sin_port = htons(myport); */

// ipv4

my_addr.sin6_port = htons(myport);   // ipv6

if(argv[3])  

/* my_addr.sin_addr.s_addr = inet_addr(argv[3]); */

// ipv4

inet_pton(af_inet6, argv[3], &my_addr.sin6_addr);  // ipv6

else

/* my_addr.sin_addr.s_addr = inaddr_any; */

// ipv4

my_addr.sin6_addr = in6addr_any;            // ipv6

/* if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) */

// ipv4

if(bind(sockfd, (

struct

sockaddr *) &my_addr, 

sizeof

(struct

sockaddr_in6))  

// ipv6

== -1)  else

printf("binded/n"

);  

if(listen(sockfd, lisnum) == -1)  else

printf("begin listen/n"

);  

while

(1)  else

printf("server: got connection from %s, port %d, socket %d/n"

,  /* inet_ntoa(their_addr.sin_addr), */

// ipv4

inet_ntop(af_inet6, &their_addr.sin6_addr, buf, sizeof

(buf)), 

// ipv6

/* ntohs(their_addr.sin_port), new_fd); */

// ipv4

their_addr.sin6_port, new_fd); // ipv6

/* 開始處理每個新連線上的資料收發 */

bzero(buf, maxbuf + 1);  

strcpy(buf,  

"這是在連線建立成功後向客戶端傳送的第乙個訊息/n只能向new_fd這個用accept函式新建立的socket發訊息,不能向sockfd這個監聽socket傳送訊息,監聽socket不能用來接收或傳送訊息/n"

);  

/* 發訊息給客戶端 */

len = send(new_fd, buf, strlen(buf), 0);  

if(len < 0)  else

printf("訊息'%s'傳送成功,共傳送了%d個位元組!/n"

,  buf, len);  

bzero(buf, maxbuf + 1);  

/* 接收客戶端的訊息 */

len = recv(new_fd, buf, maxbuf, 0);  

if(len > 0)  

printf("接收訊息成功:'%s',共%d個位元組的資料/n"

,  buf, len);  

else

printf  

("訊息接收失敗!錯誤**是%d,錯誤資訊是'%s'/n"

,  errno, strerror(errno));  

/* 處理每個新連線上的資料收發結束 */

}  close(sockfd);  

return

0;  

}  

每行程式後面的 「//ipv4」 表示這行**是在ipv4網路裡用的

而「//ipv6」 表示這行**是在ipv6網路裡用的,比較一下,會很容易看到差別的。

客戶端源**如下:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define maxbuf 1024

intmain(

intargc, 

char

**argv)  

/* 建立乙個 socket 用於 tcp 通訊 */

/* if ((sockfd = socket(af_inet, sock_stream, 0)) < 0)   

printf("socket created/n"

);  

/* 初始化伺服器端(對方)的位址和埠資訊 */

bzero(&dest, sizeof

(dest));  

/* dest.sin_family = af_inet; */

// ipv4

dest.sin6_family = af_inet6;     // ipv6

/* dest.sin_port = htons(atoi(argv[2])); */

// ipv4

dest.sin6_port = htons(atoi(argv[2]));     // ipv6

/* if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0)   

printf("address created/n"

);  

/* 連線伺服器 */

if(connect(sockfd, (

struct

sockaddr *) &dest, 

sizeof

(dest)) != 0)   

printf("server connected/n"

);  

/* 接收對方發過來的訊息,最多接收 maxbuf 個位元組 */

bzero(buffer, maxbuf + 1);  

/* 接收伺服器來的訊息 */

len = recv(sockfd, buffer, maxbuf, 0);  

if(len > 0)  

printf("接收訊息成功:'%s',共%d個位元組的資料/n"

,  buffer, len);  

else

printf  

("訊息接收失敗!錯誤**是%d,錯誤資訊是'%s'/n"

,  errno, strerror(errno));  

bzero(buffer, maxbuf + 1);  

strcpy(buffer, "這是客戶端發給伺服器端的訊息/n"

);  

/* 發訊息給伺服器 */

len = send(sockfd, buffer, strlen(buffer), 0);  

if(len < 0)  

printf  

("訊息'%s'傳送失敗!錯誤**是%d,錯誤資訊是'%s'/n"

,  buffer, errno, strerror(errno));  

else

printf("訊息'%s'傳送成功,共傳送了%d個位元組!/n"

,  buffer, len);  

/* 關閉連線 */

close(sockfd);  

return

0;  

}  

編譯程式用下列命令:

gcc -wall ipv6-server.c -o ipv6server

gcc -wall ipv6-client.c -o ipv6client

你自己的主機有ipv6位址嗎?很多人會問,輸入ifconfig命令看一下吧:

自增 i與i 自減 i與i

a 前置自增 變數值先 1,再計算表示式的值 前自增,先增再用 a 後置自增 先計算表示式的值 變數值後 1 後自增,先用再增 a 後置自減 先計算表示式的值 變數值後 1 後自減,先用再減 a 前置自減 變數值先 1,再計算表示式的值 前自減,先減再用 當自增自減遇上邏輯與和邏輯或 因邏輯與一非即...

i 與 i(i 與 i同理)

1.單獨用時,是一樣的,i 等同於 i 相當於i i 1 若賦值時,a i 相當於a i i i 1 而a i 相當於i i 1 a i 2.for迴圈中,i 等同於 i 如 for i 0 i 10 i for i 0 i 10 i 而在while迴圈中,有區別 如 while count whi...

詳細解析i 與 i

i 與 i是特殊的自增運算,類似的還有自減操作運算i 與 i。下面從c與c 兩個角度來比較這兩種形式的運算方式。1.c中 簡單的地說,i和i 作為乙個語句單獨使用時 如i 或者 i 就是i i 1,它們之間沒有區別。而在作為語句的一部分時,a i相當於i i 1 a i 通過表示式就可以看出,因為 ...