1. 程式人生 > >linux下建立伺服器與客戶端

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;
}