wordpress整站源碼網(wǎng)絡營銷的目的是什么
目錄
國際網(wǎng)絡通信協(xié)議標準:
1.OSI協(xié)議:
?2.TCP/IP協(xié)議模型:
?應用層??:
?傳輸層:
??網(wǎng)絡層:?????????????IPV4協(xié)議????????????IP地址
?IP地址的劃分:????????????公有地址????????????私有地址
????????MAC地址:
????????端口號:
?UDP編程
1.套接字:
2.流程??
3.函數(shù)接口
(1)?socket
?(2)sendto?
(3)?inet_addr
(4)?htons?
(5)?bind?
(6)recvfrom?
?主機作為發(fā)送端
主機作為接收端
?網(wǎng)絡:
協(xié)議:通信雙方約定的一套標準?
國際網(wǎng)絡通信協(xié)議標準:
1.OSI協(xié)議:
????????應用層??????????發(fā)送的數(shù)據(jù)內(nèi)容
????????表示層??????????數(shù)據(jù)是否加密
????????會話層??????????是否建立會話連接
????????傳輸層??????????數(shù)據(jù)傳輸?shù)姆绞?br /> ????????網(wǎng)絡層??????????數(shù)據(jù)的路由
????????數(shù)據(jù)鏈路層??????局域網(wǎng)內(nèi)部通信
????????物理層??????????物理介質(zhì)的連接
?2.TCP/IP協(xié)議模型:
?
????????應用層??????????發(fā)送的數(shù)據(jù)內(nèi)容
????????傳輸層??????????數(shù)據(jù)傳輸?shù)姆绞?br /> ????????網(wǎng)絡層??????????數(shù)據(jù)由一臺主機到達另一臺主機
????????網(wǎng)絡接口層??????物理介質(zhì)連接?
?應用層??:
????????????FTP?????文件傳輸協(xié)議????
????????????TFTP????簡單文件傳輸協(xié)議
????????????HTTP????超文本傳輸協(xié)議
????????????HTTPS???安全超文本傳輸協(xié)議
????????????SMTP????簡單郵件傳輸協(xié)議
????????????TELNET??網(wǎng)絡終端登錄協(xié)議
????????????DNS?????域名系統(tǒng)
????????????..?
?傳輸層:
????TCP?????傳輸控制協(xié)議
? ? ?UDP?????用戶數(shù)據(jù)報協(xié)議
????????????UDP:不安全、不可靠的傳輸方式
?????????????????UDP機制簡單
?????????????????UDP占用的資源開銷比較小
????????????TCP:安全、可靠的傳輸方式
?????????????????TCP機制復雜
?????????????????TCP占用的資源開銷比較大?
????????????????????三次握手建立連接,確認雙方能夠通信
????????????????????通信過程中保障數(shù)據(jù)傳輸?shù)耐暾?br /> ????????????????????四次揮手斷開連接,確保數(shù)據(jù)傳輸?shù)耐暾?/p>
??網(wǎng)絡層:?
????????????IPV4協(xié)議
????????????IP地址
????????????管理員IP地址形式:192.168.0.167
????????????內(nèi)存IP地址形式:??11000000.10101000.00000000.10100111
????????????IP地址?=?網(wǎng)絡位?+?主機位?
????????????網(wǎng)絡位:IP地址所屬的網(wǎng)段(局域網(wǎng)的編號)
????????????主機位:局域網(wǎng)中的第幾臺主機
????????????網(wǎng)段號:網(wǎng)絡位不變,主機位全為0?
????????????廣播號:網(wǎng)絡位不變,?主機位全為1?
????????????子網(wǎng)掩碼:每個IP地址都會搭配一個子網(wǎng)掩碼,用來區(qū)分IP地址的網(wǎng)絡位及主機位
?????????????????????子網(wǎng)掩碼展開成二進制,1對應的部分就是IP地址的網(wǎng)絡位,0對應的部分就是IP地址的主機位
????????????192.168.0.167
????????????255.255.255.0
????????????11000000.10101000.00000000.10100111
????????????11111111.11111111.11111111.00000000
? ? ? ? ? ? 網(wǎng)段號192.168.0.0
? ? ? ? ? ? 廣播號192.168.0.255
?IP地址的劃分:
????????????公有地址
????????????私有地址
????????????A類:1.0.0.0?~?126.255.255.255
????????????????子網(wǎng)掩碼:255.0.0.0?
????????????????管理超大規(guī)模型網(wǎng)絡
????????????????私有地址:10.0.0.0?~?10.255.255.255
????????????B類:128.0.0.0?~?191.255.255.255
????????????????子網(wǎng)掩碼:255.255.0.0?
????????????????管理大中規(guī)模型網(wǎng)絡
????????????????私有地址:172.16.0.0?-?172.31.255.255
????????????C類:192.0.0.0?~?223.255.255.255
????????????????子網(wǎng)掩碼:255.255.255.0
????????????????管理中小規(guī)模型網(wǎng)絡
????????????????私有地址:192.168.0.0?~?192.168.255.255
????????????D類:224.0.0.0?~?239.255.255.255
????????????????用于組播:255.255.255.0
????????????E類:240.0.0.0?~?255.255.255.255
????????????????用于實驗和研究:255.255.255.0
????????MAC地址:
?設備自帶網(wǎng)卡的地址(該地址是唯一的)
????????端口號:
?找到同一臺主機不同的應用程序
?UDP編程
1.套接字:
????????實現(xiàn)Linux系統(tǒng)下的網(wǎng)絡通信
????????套接字:一次通信對象的抽象
2.流程??
發(fā)送端流程:1.創(chuàng)建套接字
???????????????2.發(fā)送信息
???????????????3.關閉套接字
????接收端流程:?1.創(chuàng)建套接字???????
????????????????2.綁定IP和Port
????????????????3.接收信息?
????????????????4.關閉套接字
3.函數(shù)接口
(1)?socket
socket?
??????int?socket(int?domain,?int?type,?int?protocol);
??????功能:
????????創(chuàng)建套接字
??????參數(shù):
????????domain:?AF_INET?表示IPV4協(xié)議
????????type:套接字類型
????????????SOCK_STREAM:流式套接字
????????????SOCK_DGRAM:數(shù)據(jù)報套接字
????????????SOCK_RAW:原始套接字
????????protocol:
????????????TCP和UDP協(xié)議:0
??????返回值:??
????????成功返回用來通信的文件描述符
????????失敗返回-1?
?
?(2)sendto?
sendto?
??????ssize_t?sendto(int?sockfd,?const?void?*buf,?size_t?len,?int?flags,
??????????????????????const?struct?sockaddr?*dest_addr,?socklen_t?addrlen);
??????功能:
????????發(fā)送信息
??????參數(shù):
????????sockfd:套接字文件描述符
????????buf:發(fā)送數(shù)據(jù)空間首地址
????????len:發(fā)送數(shù)據(jù)長度
????????flags:發(fā)送屬性?默認為0?
????????dest_addr:目標地址存放空間首地址
????????addrlen:目的地址的長度struct?sockaddr_in?{
????????????sa_family_t????sin_family;?/*?address?family:?AF_INET?*/
????????????in_port_t??????sin_port;???/*?port?in?network?byte?order?*/
????????????struct?in_addr?sin_addr;???/*?internet?address?*/
????????};
????????/*?Internet?address.?*/
????????struct?in_addr?{
????????????uint32_t???????s_addr;?????/*?address?in?network?byte?order?*/
????????};
??????返回值:
????????成功返回發(fā)送字節(jié)數(shù)
????????失敗返回-1???如果sendto對應的套接字沒有綁定端口,則sendto綁定一個隨機端口完成發(fā)送功能
(3)?inet_addr
inet_addr
??????in_addr_t?inet_addr(const?char?*cp);
??????功能:
????????將字符串的IP地址轉(zhuǎn)換為32位的地址類型
(4)?htons?
htons?
??????uint16_t?htons(uint16_t?hostshort);
??????功能:????
????????將本地字節(jié)序(小端)轉(zhuǎn)換成網(wǎng)絡大端字節(jié)序
?
(5)?bind?
bind?
??????int?bind(int?sockfd,?const?struct?sockaddr?*addr,?socklen_t?addrlen);
??????功能:
????????將套接字與IP地址和端口進行綁定
??????參數(shù):
????????addr:綁定地址結(jié)構(gòu)體空間首地址
????????addrlen:綁定地址空間大小
??????返回值:
????????成功返回0?
????????失敗返回-1?
??????注意:
????????只能綁定自己的IP地址
(6)recvfrom?
?ssize_t?recvfrom(int?sockfd,?void?*buf,?size_t?len,?int?flags,
????????????????????????struct?sockaddr?*src_addr,?socklen_t?*addrlen);
??????功能:
????????接收信息
??????參數(shù):
????????sockfd:套接字文件描述符
????????buf:接收數(shù)據(jù)空間首地址
????????len:接收數(shù)據(jù)長度
????????flags:接收的屬性?默認為0?
????????src_addr:存放發(fā)送方地址空間的地址
????????addrlen:?要接收的發(fā)送方地址的長度
??????返回值:
????????成功返回實際接收字節(jié)數(shù)
????????失敗返回-1?
?練習一:
主機作為發(fā)送端
#include "../head.h"
//主機作為發(fā)送方
int main()
{int sockfd=0;ssize_t nsize=0;struct sockaddr_in recvaddr;struct sockaddr_in sendaddr;//創(chuàng)建用來通信的套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);//AF_INET:IPV4協(xié)議族,SOCK_DGRAM:UDP數(shù)據(jù)報套接字if(sockfd==-1){perror("failed to socket");return -1;}//將發(fā)送端套接字與IP地址和端口號綁定sendaddr.sin_family=AF_INET;sendaddr.sin_port=htons(30000);sendaddr.sin_addr.s_addr=inet_addr("192.168.0.185");bind(sockfd,(struct sockaddr *)&sendaddr,sizeof(sendaddr));//為目的地址賦值recvaddr.sin_family=AF_INET;//協(xié)議族為IPV4recvaddr.sin_port=htons(8080);//端口號( htons() 將本地字節(jié)序(小端)轉(zhuǎn)換為網(wǎng)絡字節(jié)序(大端))(發(fā)送給wltszs4.3.29網(wǎng)絡調(diào)試助手)recvaddr.sin_addr.s_addr=inet_addr("192.168.0.135");//IP地址( inet_addr() 將字符串類型轉(zhuǎn)換為二進制地址類型)//向目的地址發(fā)送數(shù)據(jù)nsize=sendto(sockfd,"66666666666",12,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));//注意強制類型轉(zhuǎn)換if(nsize==-1){perror("failed to sendto");return 0;}printf("發(fā)送成功\n");//關閉套接字close(sockfd);return 0;
}
主機作為接收端
#include "../head.h"
int main()
{int sockfd=0;int ret=0;char tmpbuff[200]={0};ssize_t nsize=0;struct sockaddr_in recvaddr;//創(chuàng)建套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){perror("failed to socket");return -1;}//將套接字和IP地址與端口號綁定recvaddr.sin_family=AF_INET;recvaddr.sin_port=htons(20000);recvaddr.sin_addr.s_addr=inet_addr("192.168.0.185");ret=bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(ret==-1){perror("failed to bind");return 0;}//接受數(shù)據(jù)nsize=recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,NULL,NULL);if(nsize==-1){perror("failed to recvfrom");return 0;}//打印數(shù)據(jù)printf("接收到字節(jié)數(shù):%ld,內(nèi)容為:%s\n",nsize,tmpbuff);//關閉套接字close(sockfd);return 0;
}
練習二:利用UDP編程發(fā)送文件
發(fā)送端send.c
#include "../head.h"
int main()
{int sockfd;int ret=0;FILE *fp=NULL;struct sockaddr_in recvaddr;char readbuff[1024]={0};size_t size=0;ssize_t nsize=0;//創(chuàng)建套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){perror("failed to socket");return -1;}//為目的地址賦值recvaddr.sin_family=AF_INET;recvaddr.sin_port=htons(30000);recvaddr.sin_addr.s_addr=inet_addr("192.168.0.187");//輸入要發(fā)送的文件名printf("請輸入要發(fā)送的文件名:");fgets(readbuff,sizeof(readbuff),stdin);readbuff[strlen(readbuff)-1]='\0';//打開該文件fp=fopen(readbuff,"r");if(fp==NULL){perror("failed to fopen send.txt");return -1;}//發(fā)送文件名nsize=sendto(sockfd,readbuff,strlen(readbuff)+1,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(nsize==-1){perror("failed to sendto");return -1;}
//發(fā)送文件內(nèi)容
while(1)
{size=fread(readbuff,1,sizeof(readbuff),fp);if(size<=0){break;}nsize=sendto(sockfd,readbuff,size,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(nsize==-1){perror("failed to sendto");return -1;}
}
//發(fā)送文件結(jié)尾關閉標志sprintf(readbuff,".quit");nsize=sendto(sockfd,readbuff,size,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(nsize==-1){perror("failed to sendto");return -1;}//關閉套接字和文件close(sockfd);fclose(fp);return 0; }
接收文件端
#include "../head.h"
int main()
{int sockfd;int ret=0;FILE *fp=NULL;char filename[100]={0};char tmpbuff[1024]={0};struct sockaddr_in recvaddr;char readbuff[1024]={0};size_t size=0;ssize_t nsize=0;//創(chuàng)建套接字sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){perror("failed to socket");return -1;}//綁定接收IP地址和套接字,端口號recvaddr.sin_family=AF_INET;recvaddr.sin_port=htons(30000);recvaddr.sin_addr.s_addr=inet_addr("192.168.0.187");bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));//接收文件名nsize=recvfrom(sockfd,filename,sizeof(filename),0,NULL,NULL);if(nsize==-1){perror("failed to recvfrom");return -1;}//創(chuàng)建文件fp=fopen(filename,"w");if(fp==NULL){perror("failed to fopen");return -1;}//接收文件內(nèi)容while (1){nsize=recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,NULL,NULL);if(nsize==0){break;}if(!strcmp(tmpbuff,".quit")){break;}fwrite(tmpbuff,nsize,1,fp);}//關閉套接字和文件close(sockfd);fclose(fp);return 0; }
練習三:利用UDP編程實現(xiàn)聊天功能
1.(進程實現(xiàn))
send.c
#include "../head.h"
int main()
{pid_t pid;struct sockaddr_in sendaddr;struct sockaddr_in recvaddr;char tmpbuff[100]={0};ssize_t size_send;ssize_t size_recv;int sockfd=0;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){perror("failed to socket");return -1;}recvaddr.sin_family=AF_INET;recvaddr.sin_port=htons(30000);recvaddr.sin_addr.s_addr=inet_addr("192.168.0.187");//第一次發(fā)送是為了建立連接,數(shù)據(jù)可隨機發(fā)送,不打印size_send = sendto(sockfd,"hello",6,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(size_send==-1){perror("failed to sendto");return -1;}pid=fork();if(pid==-1){perror("failed to fork");return -1;}if(pid==0){ while (1){memset(tmpbuff,0,sizeof(tmpbuff));fgets(tmpbuff,sizeof(tmpbuff),stdin);tmpbuff[strlen(tmpbuff)-1]='\0';size_send=sendto(sockfd,tmpbuff,strlen(tmpbuff),0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(size_send==-1){perror("failed to sendto");return -1;}if(!strcmp(tmpbuff,".quit")){break;}}kill(getppid(),SIGKILL);}else if(pid>0){while(1){memset(tmpbuff,0,sizeof(tmpbuff));size_recv = recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,NULL,NULL);if(size_recv==-1){perror("failed to recvfrom");return -1;}if(!strcmp(tmpbuff,".quit")){break;}printf("RECV:%s\n",tmpbuff);}kill(pid,SIGKILL);}close(sockfd);return 0;}
recv.c
#include "../head.h"
int main()
{pid_t pid;struct sockaddr_in sendaddr;struct sockaddr_in recvaddr;size_t size_send;size_t size_recv;char tmpbuff[100]={0};socklen_t addrlen=sizeof(sendaddr);int ret=0;int sockfd=0;sockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd==-1){perror("failed to socket");return -1;}recvaddr.sin_family=AF_INET;recvaddr.sin_port=htons(30000);recvaddr.sin_addr.s_addr=inet_addr("192.168.0.187");ret=bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));if(ret==-1){perror("failed to bind");return -1;}
//第一次接收是為了建立連接,數(shù)據(jù)不打印size_recv = recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,(struct sockaddr *)&sendaddr,&addrlen);if(size_recv==-1){perror("failed to recvfrom");return -1;}pid=fork();if(pid==-1){perror("failed to fork");return -1;}if(pid==0){while(1){memset(tmpbuff,0,sizeof(tmpbuff));size_recv = recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,NULL,NULL);if(size_recv==-1){perror("failed to sendto");return -1;}if(!strcmp(tmpbuff,".quit")){break;}printf("RECV:%s\n",tmpbuff);}kill(getppid(),SIGKILL);}else if(pid>0){while (1){memset(tmpbuff,0,sizeof(tmpbuff));fgets(tmpbuff,sizeof(tmpbuff),stdin);tmpbuff[strlen(tmpbuff)-1]='\0';size_send=sendto(sockfd,tmpbuff,strlen(tmpbuff),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));if(size_send==-1){perror("failed to sendto");return -1;}if(!strcmp(tmpbuff,".quit")){break;}}kill(pid,SIGKILL);}close(sockfd);return 0;}
2.(線程實現(xiàn))
send.c
#include "../head.h"int sockfd = 0;
pthread_t tid1;
pthread_t tid2;
struct sockaddr_in recvaddr;void *thread1(void *arg)
{char tmpbuff[1024] = {0};ssize_t nsize = 0;while (1){memset(tmpbuff, 0, sizeof(tmpbuff));fgets(tmpbuff, sizeof(tmpbuff), stdin);tmpbuff[strlen(tmpbuff)-1] = '\0';nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return NULL;}if (!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid2);return NULL;
}void *thread2(void *arg)
{ char tmpbuff[1024] = {0};ssize_t nsize = 0;while (1){memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return NULL;}if (!strcmp(tmpbuff, ".quit")){break;}printf("RECV:%s\n", tmpbuff);}pthread_cancel(tid1);return NULL;
}int main(void)
{//1.創(chuàng)建套接字char tmpbuff[1024] = {"hello"};ssize_t nsize = 0;recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(RECV_PORT);recvaddr.sin_addr.s_addr = inet_addr(RECV_IP);sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}//2.發(fā)送一次nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}//3.創(chuàng)建兩個線程pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);close(sockfd);return 0;
}
recv.c
#include "../head.h"int sockfd = 0;
pthread_t tid1;
pthread_t tid2;
struct sockaddr_in recvaddr;
struct sockaddr_in sendaddr;void *thread1(void *arg)
{char tmpbuff[1024] = {0};ssize_t nsize = 0;while (1){memset(tmpbuff, 0, sizeof(tmpbuff));fgets(tmpbuff, sizeof(tmpbuff), stdin);tmpbuff[strlen(tmpbuff)-1] = '\0';nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr));if (-1 == nsize){perror("fail to sendto");return NULL;}if (!strcmp(tmpbuff, ".quit")){break;}}pthread_cancel(tid2);return NULL;
}void *thread2(void *arg)
{ char tmpbuff[1024] = {0};ssize_t nsize = 0;while (1){memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return NULL;}if (!strcmp(tmpbuff, ".quit")){break;}printf("RECV:%s\n", tmpbuff);}pthread_cancel(tid1);return NULL;
}int main(void)
{//1.創(chuàng)建套接字char tmpbuff[1024] = {"hello"};ssize_t nsize = 0;int ret = 0;socklen_t addrlen = sizeof(sendaddr);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(RECV_PORT);recvaddr.sin_addr.s_addr = inet_addr(RECV_IP);sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == ret){perror("fail to bind");return -1;}//2.接收一次nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, (struct sockaddr *)&sendaddr, &addrlen);if (-1 == nsize){perror("fail to recvfrom");return -1;}//3.創(chuàng)建兩個線程pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);close(sockfd);return 0;
}