Linux迭代服務器

Linux迭代服務器

最近在學習linux下Socket開發,最簡單的就是迭代服務器
在網絡程序裏面,一般都是一個服務器處理多個客戶機,爲了出個多個客戶機的請求,服務器端的程序有不一樣的處理方式。本節開始介紹Linux下套接字編程的服務器模型選擇,主要包括循環服務器模型、併發服務器模型、IO複用服務器模型等,這也是咱們常見的幾種網絡服務器模型。其中基本能夠分爲兩大類,linux

  1. 迭代服務器:循環服務器在同一時刻只能響應一個客戶端的請求,是比較簡單的一種模型;
  2. 併發服務器:併發服務器在同一時刻能夠響應多個客戶端的請求,這裏面又有不少分類,接下來會逐步介紹;

迭代服務器模型

迭代服務器是指對於客戶端的請求和鏈接,服務器逐個進行處理,處理完一個鏈接後再處理下一個鏈接,屬於串行處理方式,結構比較簡單。樣例代碼是服務端向客戶端輸出日期時間的功能。
如下是服務端代碼:
server.c編程

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#define BUFFLEN 1024
#define SERVER_PORT 12346
#define BACKLOG 5
int main(int argc, char *argv[])
{
    printf("等待客戶端鏈接:\n");
    int s_s, s_c;    /*服務器套接字文件描述符*/
    struct sockaddr_in local, from;    /*本地地址*/
    time_t now;        
    char buff[BUFFLEN];
    int n = 0;
    int len = sizeof(from);
    
    /*創建TCP套接字*/
    s_s = socket(AF_INET, SOCK_STREAM, 0);
    
    /*初始化地址*/
    memset(&local, 0, sizeof(local));
    local.sin_family = AF_INET;/*AF_INET協議族*/
    local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/
    local.sin_port = htons(SERVER_PORT);/*服務器端口*/
    
    /*將套接字文件描述符綁定到本地地址和端口*/
    int err = bind(s_s, (struct sockaddr*)&local, sizeof(local));
    err = listen(s_s, BACKLOG);/*偵聽*/
    
    /*主處理過程*/
    while(1)
    {
        /*接收客戶端鏈接*/
        s_c = accept(s_s, (struct sockaddr*)&from, &len);
        memset(buff, 0, BUFFLEN);
        n = recv(s_c, buff, BUFFLEN,0);/*接收發送方數據*/
        if(n > 0 && !strncmp(buff, "TIME", 4))/*判斷是否合法接收數據*/
        {printf("have one\n");
            memset(buff, 0, BUFFLEN);
            now = time(NULL);
            sprintf(buff, "%12s\r\n",ctime(&now));    
            send(s_c, buff, strlen(buff),0);/*發送數據*/
            sleep(10);//此處沉睡10秒
        }
        close(s_c);
    }
    close(s_s);
    
    return 0;        
}

如下是客戶端代碼:服務器

client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>

#define BUFFLEN 1024
#define SERVER_PORT 12346
int main(int argc, char *argv[])
{
    int s;    /*服務器套接字文件描述符*/
    struct sockaddr_in server;    /*本地地址*/
    char buff[BUFFLEN];
    int n = 0;    
    
    /*創建TCP套接字*/
    s = socket(AF_INET, SOCK_STREAM, 0);
    
    /*初始化地址*/
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;/*AF_INET協議族*/
    server.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/
    server.sin_port = htons(SERVER_PORT);/*服務器端口*/    
    
    /*鏈接服務器*/
    int err = connect(s, (struct sockaddr*)&server,sizeof(server));
    memset(buff, 0, BUFFLEN);
    strcpy(buff, "TIME");
    /*發送數據*/
    send(s, buff, strlen(buff), 0);
    memset(buff, 0, BUFFLEN);
    /*接收數據*/    
    n = recv(s, buff, BUFFLEN, 0);
    if(n >0){
        printf("TIME:%s",buff);    
    }
    close(s);
    
    return 0;        
}

爲了證實是迭代服務器,,故意在服務器中處理完一個鏈接後睡眠10秒,開啓兩個客戶端,如圖,能夠看到時間差距爲10秒,由於循環服務器成功。

圖片描述

相關文章
相關標籤/搜索