1、什么是計算機網(wǎng)絡?

多個計算機進行通信--->計算機網(wǎng)絡。
2、計算機通信的復雜度
(1)、傳輸信息的復雜度(種類、內(nèi)容);
(2)、信息的數(shù)量
(3)、傳輸距離(干擾...)
(4)、信息的安全問題
(5)、計算機體系的完整性和封閉性。
既要保證計算機的封閉性,又要達成計算機的通信。
3、ip地址
(1)、IP地址是有限的,需要一種方式將IP地址復用。
(2)、IP地址的復用導致了數(shù)據(jù)傳遞的復雜性(ATM,存儲轉(zhuǎn)發(fā)機制;路由機制)。
(3)、IP地址過于抽象不方便使用,于是給出了IP地址的人文化轉(zhuǎn)義:域名。
(4)、域名只能代表一個IP網(wǎng)絡地址,于是就只能代表一個網(wǎng)絡上的節(jié)點實體。
(5)、實際上訪問節(jié)點的時候,本質(zhì)上使用的是IP地址,所以就需要將域名轉(zhuǎn)化為IP地址(DNS...)
4、IP地址的分類
(1)、IPv4地址是4字節(jié)的,中間以 . 劃分;IPv6地址是16字節(jié)的;
規(guī)定:在IP地址劃分上,一般不取全0/全1;
IP一般分為5類;
A、B、C、D、E,一般常用的IP地址為A類,B類,C類;

A類IP:第一個字節(jié)是以0開頭 0000 0000--->0111 1111 0~127
B類IP:第一個字節(jié)是以10開頭 1000 0000--->1011 1111 128~191
C類IP:第一個字節(jié)是以110開頭 1100 0000--->1101 1111 192~223
(2)、子網(wǎng)掩碼:就是將網(wǎng)絡號設置為1,主機號設置為0(對每一個字節(jié)的位進行設置);
例:C類IP地址,3個字節(jié)網(wǎng)絡號和一個字節(jié)的主機號;
1111 1111 1111 1111 1111 1111 0000 0000
255 . 255 . 255 . 0
(3)、子網(wǎng)劃分:此時就存在C類地址的子網(wǎng)掩碼不一定總是255.255.255.0;
這還的看C類IP下面有沒有子網(wǎng)劃分,
有子網(wǎng)劃分的話,最后一個字節(jié),也就是主機號可能為2段(01/10)、4段(00/01/10/11)
例:192.168.3.11xx xxxx 1111 1111 1111 1111 1111 1111 1100 0000
此時對應的子網(wǎng)掩碼為:255.255.255.192
(4)、IOS和TCP/IP
模型分析

(5)、端口號
port:唯一標識應用程序的編號;
我們之間通過QQ、微信、郵箱進行收發(fā)數(shù)據(jù)時,沒有導致數(shù)據(jù)的錯亂接收,是怎么做到的呢?又是怎么一一對應找到的呢?
:通過端口號,識別了電腦上的某一應用程序,也就是找對應的編號。
我們在進行數(shù)據(jù)的發(fā)送時:首先通過IP尋找物理計算機,在根據(jù)port,尋找對應的應用程序。
(6)、TCP和UDP
UDP屬于TCP/IP體系中的一部分。
TCP協(xié)議和UDP協(xié)議都屬于傳輸層協(xié)議。
TCP協(xié)議:
i>、面向連接的傳輸協(xié)議、可靠的、同步的;
ii>、面向連接的網(wǎng)絡傳輸特點:a、需要有一方主動的建立連接,另一方接收連接請求;b、只有建立了連接之后才能夠進行數(shù)據(jù)的傳輸;c、當數(shù)據(jù)傳輸完畢之后,就需要釋放連接,由連接的兩端來共同決定連接是否保持。
UDP協(xié)議:
a、面向無連接的:即就是在進行數(shù)據(jù)傳輸?shù)臅r候,不需要預先創(chuàng)建一個連接;
b、不可靠的:無法知道發(fā)送的數(shù)據(jù)是否能夠到達目的,也無法知道什么時候能夠到達目的。
c、異步的:
(7)、TCP的三次握手、四次揮手
TCP------->至少3次握手(最后一次防止誤按,2次的話,有可能死鎖); : 打電話模型
模型分析

TCP-------->4次揮手。 模型:男女朋友分手模型

通過IP,只能保證物理上的連通,至于收發(fā)數(shù)據(jù)的形式是什么,都不歸它管。
127.0.0.1:本機回送地址,可作為測試本機使用,不安裝網(wǎng)卡也是可以ping通的。
5、TCP的編程實現(xiàn)
基礎的socket編程對TCP的就是下面的步驟:
(1)、模型分析

(2)、代碼實現(xiàn)
utili.h
#include<stdio.h> #include<unistd.h> #include<string.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define SERVER_PORT 9090 #define SERVER_IP "127.0.0.1" #define LISTEN_QUEUE 5 #define BUF_SIZE 255
服務器端代碼:
#include"utili.h"
//TCP
int main(void){
int sockSer = socket(AF_INET, SOCK_STREAM, 0);
if(sockSer == -1){
perror("socket");
return -1;
}
struct sockaddr_in addrSer, addrCli;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
int yes = 1;
setsockopt(sockSer, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); //地址、端口的重用
socklen_t len = sizeof(struct sockaddr);
int res = bind(sockSer, (struct sockaddr *)&addrSer, len);
if(res == -1){
perror("bind");
close(sockSer);
return -1;
}
res = listen(sockSer, LISTEN_QUEUE);
if(res == -1){
perror("listen");
close(sockSer);
return -1;
}
int sockConn;
char sendbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
while(1){
sockConn = accept(sockSer, (struct sockaddr *)&addrCli, &len);
if(sockConn == -1){
continue;
}else{
printf("Server Accept Client Connect OK\n");
}
printf("Ser :>");
scanf("%s", sendbuf);
if(strncmp(sendbuf, "quit", 4) == 0)
break;
send(sockConn, sendbuf, strlen(sendbuf)+1, 0);
recv(sockConn, recvbuf, BUF_SIZE, 0);
printf("Cli :>%s\n", recvbuf);
}
close(sockSer);
return 0;
}客戶端代碼:
#include"utili.h"
//TCP
int main(void){
int sockCli = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addrSer;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
struct sockaddr_in addrCli;
addrCli.sin_family = AF_INET;
addrCli.sin_port = htons(7070);
addrCli.sin_addr.s_addr = inet_addr("192.168.1.155");
int yes = 1;
setsockopt(sockCli, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); //地址、端口的重用
socklen_t len = sizeof(struct sockaddr);
int res = bind(sockCli, (struct sockaddr *)&addrCli, len);
if(res == -1){
perror("bind");
close(sockCli);
return -1;
}
res = connect(sockCli, (struct sockaddr*)&addrSer, len);
if(res == -1){
perror("connect");
close(sockCli);
return -1;
}else{
printf("Client Connect Server ok\n");
}
char sendbuf[BUF_SIZE];
char recvbuf[BUF_SIZE];
while(1){
connect(sockCli, (struct sockaddr*)&addrSer, len);
recv(sockCli, recvbuf, BUF_SIZE, 0);
printf("Ser :>%s\n", recvbuf);
printf("Cli :>");
scanf("%s", sendbuf);
if(strncmp(sendbuf, "quit", 4) == 0)
break;
send(sockCli, sendbuf, strlen(sendbuf)+1, 0);
}
close(sockCli);
return 0;
}(3)、運行結(jié)果


6、UDP的編程實現(xiàn)
基礎的socket編程對UDP的就是下面的步驟:
(1)、模型分析

(2)、代碼實現(xiàn)
utili.h
#include<unistd.h> #include<stdio.h> #include<string.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define SERVER_PORT 9090 #define SERVER_IP "127.0.0.1" #define LISTEN_QUEUE 5 #define BUFFER_SIZE 255
服務器端代碼:
#include"utili.h"
int main(){
int sockSer = socket(AF_INET, SOCK_DGRAM, 0);
if(sockSer == -1){
perror("socket");
return -1;
}
struct sockaddr_in addrSer, addrCli;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
socklen_t len = sizeof(struct sockaddr);
int res = bind(sockSer, (struct sockaddr*)&addrSer, len);
if(res == -1){
perror("bind");
close(sockSer);
return -1;
}
char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while(1){
recvfrom(sockSer, recvbuf, BUFFER_SIZE, 0, (struct sockaddr*)&addrCli, &len);
printf("Cli:>%s\n",recvbuf);
printf("Ser:>");
scanf("%s",sendbuf);
if(strncmp(sendbuf, "quit", 4) == 0){
break;
}
sendto(sockSer, sendbuf, strlen(sendbuf)+1, 0, (struct sockaddr*)&addrCli, len);
}
close(sockSer);
return 0;
}客戶端代碼:
#include"utili.h"
int main(){
int sockCli = socket(AF_INET, SOCK_DGRAM, 0);
if(sockCli == -1){
perror("socket");
return -1;
}
struct sockaddr_in addrSer;
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(SERVER_PORT);
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP);
char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
socklen_t len = sizeof(struct sockaddr);
while(1){
printf("Cli:>");
scanf("%s",sendbuf);
if(strncmp(sendbuf, "quit", 4) == 0){
break;
}
sendto(sockCli, sendbuf, strlen(sendbuf)+1, 0, (struct sockaddr*)&addrSer, len);
recvfrom(sockCli, recvbuf, BUFFER_SIZE, 0, (struct sockaddr*)&addrSer, &len);
printf("Ser:>%s\n",recvbuf);
}
close(sockCli);
return 0;
}(3)、運行結(jié)果
服務器端截圖

客戶端截圖

服務端的套接字總領全局,不與任何客戶端進行通信,為每一個新的客戶端所分配一個新的套接字,進行通信。
LISTEN_QUEUE:等待隊列的大小(最多等待多少隊列);
UDP:必須先知道服務器在哪。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前名稱:socket網(wǎng)絡編程-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://www.chinadenli.net/article38/dchcsp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站導航、網(wǎng)頁設計公司、網(wǎng)站制作、定制網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容