中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

黃石建設(shè)信息網(wǎng)站國內(nèi)網(wǎng)絡(luò)銷售平臺有哪些

黃石建設(shè)信息網(wǎng)站,國內(nèi)網(wǎng)絡(luò)銷售平臺有哪些,提供邢臺專業(yè)做網(wǎng)站,win7 iis搭建網(wǎng)站教程目錄 1.學(xué)習(xí)網(wǎng)絡(luò)編程前的一些基礎(chǔ)知識 2.UDP(user datagram protocol)協(xié)議的特點 3.使用有UPD編寫套接字 4.使用TCP編寫套接字 4.2.TCP客服端 4.3.TCP服務(wù)器端 4.4.單進程版本(沒有人會使用) 4.5.多進程版本 4.6.多線程版本 5.把套接字封裝 1…

目錄

1.學(xué)習(xí)網(wǎng)絡(luò)編程前的一些基礎(chǔ)知識

2.UDP(user datagram protocol)協(xié)議的特點

3.使用有UPD編寫套接字

4.使用TCP編寫套接字

4.2.TCP客服端?

4.3.TCP服務(wù)器端

4.4.單進程版本(沒有人會使用)

4.5.多進程版本

4.6.多線程版本

5.把套接字封裝


1.學(xué)習(xí)網(wǎng)絡(luò)編程前的一些基礎(chǔ)知識

1.1.IP地址

  • IP地址是在IP協(xié)議中, 用來標識網(wǎng)絡(luò)中不同主機的地址(一個IP地址標識一臺主機);
  • 通常使用 "點分十進制" 的字符串表示IP地址, 例如127.0.0.1 ; 用點分割的每一個數(shù)字表示一個字節(jié), 范圍是 0 - 255,就是一個字節(jié)的大小,IP地址剛好是4字節(jié), 32位的整數(shù);

1.2.端口號(port)?

  • 端口號是一個2字節(jié)16位的整數(shù)
  • 端口號用來標識一個進程,那么IP地址+端口號就可以標識某一臺主機的某一個進程

1.3.TCP/IP四層模型?

?

1.4.網(wǎng)絡(luò)字節(jié)序?

  • 網(wǎng)絡(luò)字節(jié)序就是大端字節(jié)序(低位放在高地址上),使用相同的字節(jié)序便于網(wǎng)絡(luò)間通信;

有系統(tǒng)提供的接口?

2.UDP(user datagram protocol)協(xié)議的特點

UDP協(xié)議是一個傳輸層協(xié)議

  • 無連接:沒有連接,客戶端發(fā)給服務(wù)器端,服務(wù)器端要先保存客戶端的信息,服務(wù)器端再使用這個信息發(fā)給對應(yīng)的客戶端(簡單地說就是需要指明發(fā)送給誰
  • 不可靠傳輸:只是傳遞數(shù)據(jù),成功與否都不會反饋
  • 面向數(shù)據(jù)報:不能向面向字節(jié)流的TCP一樣使用read和write來讀寫

3.使用有UPD編寫套接字

3.1.服務(wù)器端

3.1.1.創(chuàng)建套接字

    int sock=socket(AF_INET,SOCK_DGRAM,0);//創(chuàng)建套接字if(sock<0){std::cerr<<"socket fail: "<<errno<<std::endl;return 1;} 

3.1.2.bind服務(wù)器?

網(wǎng)絡(luò)字節(jié)序就是大端字節(jié)序(低位放在高地址上),使用相同的字節(jié)序便于網(wǎng)絡(luò)間通信;

  1. 1.需要將人識別的點分十進制,字符串風(fēng)格IP地址,轉(zhuǎn)化為4字節(jié)整數(shù)IP.2.考慮大小端的問題

服務(wù)器不用bind一個固定的IP的原因

  1. 1.云服務(wù)器,不允許bind公網(wǎng)IP,另外,在一般編寫也不會指明IP.2.一般主機有多個IP,如果只是bind一個IP,發(fā)給其他IP的數(shù)據(jù)就不會交給主機處理
  2. INADDR_ANY只要是發(fā)給這個主機的數(shù)據(jù)都會被處理

    struct sockaddr_in local;local.sin_family=AF_INET;local.sin_port=htons(port);//1.需要將人識別的點分十進制,字符串風(fēng)格IP地址,轉(zhuǎn)化為4字節(jié)整數(shù)IP.2.考慮大小端的問題//1.云服務(wù)器,不允許bind公網(wǎng)IP,另外,在一般編寫也不會指明IP.2.一般主機有多個IP,如果只是bind一個IP,發(fā)給其他IP的數(shù)據(jù)就不會交給主機處理;//INADDR_ANY只要是發(fā)給這個主機的數(shù)據(jù)都會被處理local.sin_addr.s_addr=INADDR_ANY;if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)//bind主機{std::cerr << "bind error : " << errno << std::endl;return 2;}

3.1.3.傳遞接受數(shù)據(jù)

  • UDP是無連接的,需指明發(fā)給誰,也需要保存發(fā)送端的信息

    //業(yè)務(wù)邏輯char message[1024];bool quit=false;while(!quit){//保存發(fā)送端信息struct sockaddr_in peer; socklen_t len=sizeof(peer);//接受數(shù)據(jù)ssize_t s=recvfrom(sock,message,sizeof(message)-1,0,(struct sockaddr*)&peer,&len);if(s>0){message[s]=0;std::cout<<"client# "<<message<<std::endl;}else{std::cerr<<"recvfrom"<<errno<<std::endl;return 2;}//給對端發(fā)送一個你好嗎std::string tm="你好嗎?";std::cout<<"server to client: "<<tm<<std::endl;sendto(sock,tm.c_str(),tm.size(),0,(struct sockaddr*)&peer,len);}

?3.2.客戶端

  • 客戶端不需要顯示bind,當(dāng)傳輸?shù)谝粋€數(shù)據(jù)是會自動隨機bind一個port(沒有被使用的port)
#include<iostream>
#include<cerrno>
#include<string>
#include<cstdlib>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>//client serverIP serverPort
int main(int argc,char* argv[])
{if(argc!=3){std::cout<<"請按格式輸入: client serverIP serverPort"<<std::endl;return 2;}int sock=socket(AF_INET,SOCK_DGRAM,0);//創(chuàng)建套接字if(sock<0){std::cout<<"socket create errno: "<<errno<<std::endl;return 1;}//客戶端不用顯示bind,OS會自動bind;//服務(wù)器端會有規(guī)劃,讓port是沒有被占用的,讓別人來訪問這個port;//client正常發(fā)送數(shù)據(jù)的時候,OS會自動給你bind,采用隨機端口的方式struct sockaddr_in server;server.sin_family=AF_INET;server.sin_port=htons(atoi(argv[2]));server.sin_addr.s_addr=inet_addr(argv[1]);while(1){std::string message;std::cout<<"請輸入#";std::cin>>message;sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));struct sockaddr_in tmp;socklen_t tlen=sizeof(tmp);char buffer[1024];ssize_t s=recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&tmp,&tlen);if(s>0){std::cout<<"server say#: "<<buffer<<std::endl;buffer[s]=0;   }else{std::cerr<<"recvfrom"<<errno<<std::endl;return 2;}}return 0;
}

4.使用TCP編寫套接字

4.1.TCP的特點

TCP是一個傳輸層協(xié)議,和UDP的特點相反

  • 有連接
  • 可靠傳輸
  • 面向字節(jié)流

4.2.TCP客服端?

先寫的客戶端,因為服務(wù)器端會寫多個版本

#include<iostream>
#include<stdio.h>
#include<cerrno>
#include<unistd.h>
#include<string>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>void Usage()
{std::cout<<"usage:./client server_IP server_port"<<std::endl;
}
int main(int argc,char* argv[])
{if(argc!=3){Usage();return 1;}//建立套接字int sock=socket(AF_INET,SOCK_STREAM,0);if(sock<0){std::cerr<<"socket"<<errno<<std::endl;return 2;}//自動bind//連接服務(wù)器struct sockaddr_in local;local.sin_addr.s_addr=inet_addr(argv[1]);local.sin_port=htons(atoi(argv[2]));local.sin_family=AF_INET;connect(sock,(struct sockaddr*)&local,sizeof(local));//業(yè)務(wù)邏輯while(1){char buffer[1024]={0};std::cout<<"請輸入";fgets(buffer,sizeof(buffer),stdin);write(sock,buffer,sizeof(buffer));char mes[1024]={0};read(sock,mes,sizeof(mes));std::cout<<mes<<std::endl;}return 0;
}

4.3.TCP服務(wù)器端

4.3.1.創(chuàng)建套接字和bind服務(wù)器

  • socket的第二個參數(shù)是SOCK_STREAM,UPD是SOCK_DGRAM(datagram),TCP是SOCK_STREAM(stream,就是字節(jié)流)
//建立套接字int listen_sock=socket(AF_INET,SOCK_STREAM,0);if(listen_sock<0){std::cerr<<"socket"<<errno<<std::endl;return 1;}//bind服務(wù)器struct sockaddr_in local;local.sin_family=AF_INET;local.sin_port=htons(PORT);local.sin_addr.s_addr=INADDR_ANY;//INADDR_ANY會bind執(zhí)行代碼的主機if(bind(listen_sock,(struct sockaddr*)&local,sizeof(local))<0){std::cerr<<"bind"<<errno<<std::endl;return 2;}

4.3.2.listen設(shè)為聆聽狀態(tài)

    //listen狀態(tài)listen(listen_sock,5);

?4.3.3.accept接受客戶端的連接,并返回一個文件描述符

  • 因為TCP套接字是有連接的,連接成功后也是使用返回的套接字和對端進行網(wǎng)絡(luò)通信

struct sockaddr_in tmp;
socklen_t tlen=sizeof(tmp);
//建立連接
int fd=accept(listen_sock,(struct sockaddr*)&tmp,&tlen);

4.4.單進程版本(沒有人會使用)

  • 一次只能讓一個客戶端訪問
  • 寫端關(guān)閉讀端讀到文件結(jié)尾,再讀返回0
int main()
{//...創(chuàng)建套接字、bind、listen都省略了,每次都一樣冗余while(1){struct sockaddr_in tmp;socklen_t tlen=sizeof(tmp);//建立連接int fd=accept(listen_sock,(struct sockaddr*)&tmp,&tlen);if(fd<0){std::cerr<<"accept "<<errno<<std::endl;return 3;}std::cout<<"get a new link "<<std::endl;//1.單進程versionwhile(1){char buffer[1024]={0};ssize_t s=read(fd,buffer,sizeof(buffer));if(s>0){buffer[s]=0;std::cout<<"client to server:"<<buffer<<std::endl;std::string message;message+="server to client:你好!";//給連接的客戶端發(fā)一個你好write(fd,message.c_str(),message.length());}else if(s==0){//寫端關(guān)閉讀端讀到文件結(jié)尾,再讀返回0std::cout<<"client quit!"<<std::endl;break;}else{std::cerr<<"read "<<errno<<std::endl;break;}}}
}

4.5.多進程版本

4.5.1.父進程是一個循環(huán),他要一直接收新的客服端不能等待子進程,解決方法

  1. 父進程等待子進程,子進程創(chuàng)建后再創(chuàng)建孫子進程執(zhí)行后序代碼,子進程秒退等待時間可以忽略不計;下面代碼

pid_t pid = fork();if(pid<0){continue;}else if(pid==0){//子進程close(listen_sock);if(fork()>0)exit(0);//子進程創(chuàng)建就直接退出,創(chuàng)建的孫子進程執(zhí)行后序代碼,孫子進程變成孤兒進程被1號進程領(lǐng)養(yǎng)serviceIO(fd);close(fd);exit(0);}else{//父進程close(fd);//子進程的PCB以父進程的PCB做模板初始化,不是共享的//waitpid(&pid,NULL,0);//父進程等待子進程,子進程創(chuàng)建后再創(chuàng)建孫子進程執(zhí)行后序代碼,子進程秒退等待時間可以忽略不計}

????????2.signal(SIGCHLD,SIG_IGN);//忽略SIGCHLD信號,子進程將自動釋放;?

2.關(guān)閉不用的文件描述符,父進程關(guān)閉accept返回的文件描述符,子進程關(guān)閉socket返回的文件描述符

void serviceIO(const int& fd)
{//1.單進程version,做成一個函數(shù)while(1){char buffer[1024]={0};ssize_t s=read(fd,buffer,sizeof(buffer));if(s>0){buffer[s]=0;std::cout<<"client to server:"<<buffer<<std::endl;std::string message;message+="server to client:你好!";//給連接的客戶端發(fā)一個你好write(fd,message.c_str(),message.length());}else if(s==0){//寫端關(guān)閉讀端讀到文件結(jié)尾,再讀返回0std::cout<<"client quit!"<<std::endl;break;}else{std::cerr<<"read "<<errno<<std::endl;break;}}
}int main()
{//...創(chuàng)建套接字、bind、listen都省略了,每次都一樣冗余signal(SIGCHLD,SIG_IGN);//忽略SIGCHLD信號,子進程將自動釋放while(1){struct sockaddr_in tmp;socklen_t tlen=sizeof(tmp);//建立連接int fd=accept(listen_sock,(struct sockaddr*)&tmp,&tlen);std::cout<<"get a new link "<<std::endl;if(fd<0){std::cerr<<"accept "<<errno<<std::endl;return 3;}//2.多進程versionpid_t pid = fork();if(pid<0){continue;}else if(pid==0){//子進程close(listen_sock);serviceIO(fd);close(fd);exit(0);}else{//父進程close(fd);//子進程的PCB以父進程的PCB做模板初始化,不是共享的}}
}

4.6.多線程版本

  • 線程是共享PCB的,所以在線程內(nèi)使用完畢關(guān)閉文件描述符即可;
  • 不等待線程可以使用線程分離的方法
void serviceIO(const int& fd)
{//1.單進程versionwhile(1){char buffer[1024]={0};ssize_t s=read(fd,buffer,sizeof(buffer));if(s>0){buffer[s]=0;std::cout<<"client to server:"<<buffer<<std::endl;std::string message;message+="server to client:你好!";//給連接的客戶端發(fā)一個你好write(fd,message.c_str(),message.length());}else if(s==0){//寫端關(guān)閉讀端讀到文件結(jié)尾,再讀返回0std::cout<<"client quit!"<<std::endl;break;}else{std::cerr<<"read "<<errno<<std::endl;break;}}
}
void* HandlerRequest(void* agrs)
{pthread_detach(pthread_self());int fd=*((int*)agrs);serviceIO(fd);close(fd);//記得關(guān)閉文件描述符
}
int main()
{while(1){struct sockaddr_in tmp;socklen_t tlen=sizeof(tmp);//建立連接int fd=accept(listen_sock,(struct sockaddr*)&tmp,&tlen);std::cout<<"get a new link "<<std::endl;if(fd<0){std::cerr<<"accept "<<errno<<std::endl;return 3;}pthread_t tid;pthread_create(&tid,nullptr,HandlerRequest,(void*)&fd);}return 0;
}

5.把套接字封裝

  • 使用靜態(tài)是因為不用創(chuàng)建對象就可以使用sock::Socket()等函數(shù);
#pragma once
#include<iostream>
#include<cstdlib>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>namespace ns_socket{class sock{public:static int Socket(){int sock=socket(AF_INET,SOCK_STREAM,0);if(sock<0){std::cerr<<"socket"<<std::endl;exit(1);}return sock;}static void Bind(int sock,char* port){struct sockaddr_in local;local.sin_family=AF_INET;local.sin_addr.s_addr=INADDR_ANY;local.sin_port=htons(atoi(port));if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){std::cerr<<"bind"<<std::endl;exit(2);}}static void Listen(int sock){if(listen(sock,5)<0){std::cerr<<"listen"<<std::endl;exit(3);}}static int Accept(int sock) {struct sockaddr_in tmp;socklen_t tlen=sizeof(tmp);int new_sock=accept(sock,(struct sockaddr*)&tmp,&tlen);if(new_sock<0){std::cerr<<"accept"<<std::endl;exit(4);}return new_sock;  }static void Connect(int sock,char* server_ip,char* server_port){struct sockaddr_in local;local.sin_family=AF_INET;local.sin_addr.s_addr=inet_addr(server_ip);local.sin_port=htons(atoi(server_port));if(connect(sock,(struct sockaddr*)&local,sizeof(local))<0){std::cerr<<"connect"<<std::endl;exit(5);}else{std::cout<<"connet success"<<std::endl;}}};
}

http://www.risenshineclean.com/news/35992.html

相關(guān)文章:

  • 公司網(wǎng)站建設(shè)開發(fā)濟南興田德潤優(yōu)惠嗎推廣平臺排行榜app
  • 行業(yè)網(wǎng)站建設(shè)費用百度seo推廣軟件
  • 公司 做網(wǎng)站推廣信息發(fā)布平臺
  • 做網(wǎng)站是什么專業(yè)什么工作百度后臺推廣登錄
  • 做pc端網(wǎng)站要成本么廣告推廣軟件
  • wordpress loading優(yōu)化
  • wordpress手機版怎么注冊seo站
  • 做設(shè)計排版除了昵圖網(wǎng)還有什么網(wǎng)站中國新冠疫情最新消息
  • 專業(yè)做網(wǎng)站杭州網(wǎng)站推廣平臺
  • 東營本地網(wǎng)站制作公司品牌策劃與推廣方案
  • ios wordpress 編輯器淄博seo網(wǎng)站推廣
  • 小城鎮(zhèn)建設(shè)的網(wǎng)站谷歌瀏覽器 官網(wǎng)下載
  • 做網(wǎng)站有前途云南seo網(wǎng)絡(luò)優(yōu)化師
  • 學(xué)生做的網(wǎng)站需要備案seo課程多少錢
  • 建設(shè)網(wǎng)站經(jīng)營范圍怎么在百度上添加自己的店鋪地址
  • 網(wǎng)站制作 信科網(wǎng)絡(luò)第三方推廣平臺
  • 打字建站寶愛站官網(wǎng)
  • wordpress阿里百秀全達seo
  • i深建官方網(wǎng)站怎么做免費的網(wǎng)站推廣
  • 織夢 網(wǎng)站欄目管理 很慢小紅書軟文案例
  • 網(wǎng)頁設(shè)計網(wǎng)站建設(shè)的基本流程關(guān)鍵詞工具有哪些
  • 怎樣在網(wǎng)站上做鏈接站長字體
  • 上海app網(wǎng)站開發(fā)價值信息發(fā)布平臺推廣有哪些
  • 浙江網(wǎng)站建設(shè)報價seo指的是搜索引擎
  • 湖北中牛建設(shè)有限公司網(wǎng)站網(wǎng)站搜索
  • 哪個網(wǎng)站有ae免費模板競價托管咨詢微競價
  • 現(xiàn)在幫人做網(wǎng)站賺錢嗎bt種子bt天堂
  • 建設(shè)政府信息網(wǎng)站如何注冊網(wǎng)站平臺
  • 做航空產(chǎn)品的網(wǎng)站有哪些搜索量用什么工具查詢
  • 如何將網(wǎng)站指向404太原百度網(wǎng)站快速優(yōu)化