linux下建立伺服器與客戶端
在此主要記錄一下現在所學習Linux網路程式設計的內容,主要包括Linux下網路程式設計建立客戶端與伺服器:
首先,建立伺服器,主要分為4步:
第一步:開啟socket檔案描述符。
int socket(int domain, int type, int protocol);socket函式中主要包含的3個引數:domain是我們所要選取的ip協議(主要有ipv4和ipv6,ipv4較早使用,ipv6目前使用),目前還有好多在使用ipv4,因此這裡選用ipv4;type是選用TCP協議(傳輸較為穩定)或UDP協議(傳輸不穩定,但傳輸速度較快);第三個引數不太清楚含義,一般選擇0,預設處理。
socket函式的返回值就是類似於之前所學習的檔案描述符。
第二步:bind繫結sockfd和當前電腦的ip地址及埠號。
int bind(int socket, const struct sockaddr *address,socklen_t address_len);bind的函式主要包含3個引數,第一個引數是類似於檔案描述符sockfd(即socket函式的返回值),第二個引數是一個結構體,主要包含設定的埠號(一臺pc電腦有多個軟體,一個軟體就配置一個埠,便於區分)、伺服器IP地址(通過ifconfig來獲取)、所選取的ip協議(ipv4或者ipv6);注意:我們所看到的伺服器IP地址是點十進位制的形式,要通過inet_addr()函式或者inet_pton()函式轉化為電腦所能識別的十六進位制形式。第三個引數是結構體的大小,主要是因為不知道是ipv4還是ipv6,所以通過獲取該結構體大小來確定所選取的IP協議。
第三步:建立監聽視窗;//類似於監聽有哪些裝置連線到了伺服器
int listen(int socket, int backlog);listen函式相對簡單,主要包含了2個引數。第一個引數是socket函式的返回值;第二個引數是設定的所允許連線伺服器客戶埠的數量(個人理解是這樣)。
第四步:建立接收等待事件;//等待客戶埠來連線
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);accept函式主要包含三個引數:第一個引數是socket函式的返回值;第二個引數也是第二步所設定的結構體;第三個引數同樣是結構體的大小。
至此,我們的伺服器就建立成功了,接下來建立客戶端,主要分為兩步。
第一步:開啟socket檔案描述符。//同建立伺服器的做法相同
第二步:通過connet連線伺服器。
int connect(int socket, const struct sockaddr *address, socklen_t address_len);connect函式主要包含了3個引數,與建立伺服器時所使用的bind函式類似,這裡不多太多介紹。
至此,我們的客戶埠也建立成功,現在客戶端就可以與伺服器相連了;
附錄程式碼:
/*建立伺服器*/
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;
#define SERVERADDR "192.168.237.129"
#define MYPORT 6003
#define BACKLOG 100
int main(){
int sockfd=-1;
int ret=-1;
socklen_t len=0;
struct sockaddr_in seraddr={0};
struct sockaddr_in cliaddr={0};
//第一步:開啟socket檔案描述符
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
cout<<"socket error!"<<endl;
return -1;
}
cout<<"sockfd :"<<sockfd<<endl;
//第二步:bind繫結sockfd和當前電腦的ip地址及埠號
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(MYPORT);
seraddr.sin_addr.s_addr=inet_addr(SERVERADDR);
ret=bind(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));
if(ret<0){
cout<<"bind error!"<<endl;
return -1;
}
cout<<"bind ret:"<<ret<<endl;
//第三步:建立監聽視窗
ret=listen(sockfd,BACKLOG);
if(ret<0){
cout<<"listen error"<<endl;
return -1;
}
cout<<"listen ret:"<<ret<<endl;
ret=accept(sockfd,(struct sockaddr*)&cliaddr,&len);
cout<<"hahaha ret"<<ret<<endl;
return 0;
}
/*建立客戶端*/
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;
#define SERVERADDR "192.168.237.129"
#define MYPORT 6003
int main(){
int sockfd=-1;
int ret=-1;
socklen_t len=0;
struct sockaddr_in seraddr={0};
struct sockaddr_in cliaddr={0};
//第一步:開啟socket檔案描述符
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
cout<<"socket error!"<<endl;
return -1;
}
cout<<"sockfd :"<<sockfd<<endl;
//第二步:bind繫結sockfd和當前電腦的ip地址及埠號
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(MYPORT);
seraddr.sin_addr.s_addr=inet_addr(SERVERADDR);
ret=connect(sockfd,(const struct sockaddr*)&seraddr,sizeof(seraddr));
if(ret<0){
cout<<"connect error!"<<endl;
return -1;
}
cout<<"connet successfully ret:"<<ret<<endl;
return 0;
}