一、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 通過表示式就可以看出,因為 ...