最近在學習linux下Socket開發,最簡單的就是迭代服務器
在網絡程序裏面,一般都是一個服務器處理多個客戶機,爲了出個多個客戶機的請求,服務器端的程序有不一樣的處理方式。本節開始介紹Linux下套接字編程的服務器模型選擇,主要包括循環服務器模型、併發服務器模型、IO複用服務器模型等,這也是咱們常見的幾種網絡服務器模型。其中基本能夠分爲兩大類,linux
迭代服務器是指對於客戶端的請求和鏈接,服務器逐個進行處理,處理完一個鏈接後再處理下一個鏈接,屬於串行處理方式,結構比較簡單。樣例代碼是服務端向客戶端輸出日期時間的功能。
如下是服務端代碼:
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; }