網路伺服器開發實戰練習( ) 回聲伺服器實現

2021-09-01 13:17:37 字數 3405 閱讀 8147

實現回聲伺服器的客戶端伺服器程式,客戶端通過網路連線到伺服器,並傳送任意一串英文資訊,伺服器端接受資訊後,將每個字元轉換為大寫並回送給客戶端顯示。

本示例來自於動腦學院martin老師的免費課程

例子:90年代的通訊

寄信者:

寫好要傳送的位址

還要寫好相應的姓名,因為接受位址有很多人,到底屬於誰接收就需要姓名來區分

然後放到郵筒中就可以

郵局:

傳輸信件

接受者:

由於信件比較多,小區讓每家每戶自己準備乙個信箱,按圖中步驟,最終掛於小區的傳達室,傳達室有信件來的話保安直接塞到信箱當中,這樣信就屬於收信者了,隨時可以去取,為了能夠接受信,收信者需要時不時來看一下信箱是否有信

socket通訊的三個要素:

通訊的目的位址---------------------------------------郵件傳送的位址

ip位址,我們平時的通訊都是通過ip位址進行通訊的

比如我們在瀏覽器中輸入www.baidu.com,其實訪問的是伺服器,瀏覽器會首先查詢網域名稱對應的ip位址,我們可以通過 nslookup 網域名稱 來查詢網域名稱對應的ip位址

每台主機的ip位址都是唯一的

埠號---------------------------------------------收件人的姓名

因為每台伺服器可能安裝了很多應用,我們到底要把資料傳給哪個應用,就需要通過埠區分

http協議預設埠:80  (給http伺服器用)       smtp協議預設埠:25(給郵件伺服器用)

使用的傳輸層協議

tcp、udp

而socket就像上述例子中的郵筒

不管是客戶端還是伺服器端,都會有自己的作業系統,而作業系統已經幫我們封裝好了資料鏈路層,網路層和傳輸層的具體通訊的細節都實現了封裝,電信等isp已經幫我們做好了物理層,於是客戶端和伺服器端通訊的過程就是建立socket的過程。

伺服器端**:echo_server.c

#include #include #include #include //網路的庫

#include #include //型別的定義

#include //位址轉換

//ip位址

#define ip "0.0.0.0"

//定義埠

#define server_port 888

perror_exit(const char * des)

int main(void)

//2.清空標籤,寫上位址和埠號

bzero(&server_addr,sizeof(server_addr)); //把整個結構體清零

server_addr.sin_family =af_inet;//選擇協議族ipv4

server_addr.sin_addr.s_addr = htonl(inaddr_any);//監聽本地所有ip位址,hton1是把位元組順序進行調整,把機器上的位元組順序調整為網路上的位元組順序

server_addr.sin_port =htons(server_port);//繫結埠號,htons也是把主機位元組順序轉變成網路位元組順序

//實現標籤貼到信箱

ret=bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));

if(ret == -1)

//128同一時刻允許向客戶端發起連線的數量

//把信箱掛載到傳達室,這樣就可以接信了

ret=listen(sock,128);

if(ret == -1)

printf("等待客戶端的連線\n");

//伺服器一直等等待接受來信

int done = 1;

while(done)*/

buf[i] = toupper(buf[i]);

}len = write(client_sock, buf, len);

printf("write finished. len: %d\n", len);

close(client_sock);}}

步驟總結:

(1)建立伺服器的socket

(2)建立伺服器位址包括ip位址和埠號以及使用的協議族

(3)將socket和伺服器位址繫結到一起

(4)監聽埠

(5)接收客戶端通訊

(6)處理客戶端請求

客戶端:

//客戶端

#include #include #include #include #include #include #define server_port 666

#define server_ip "127.0.0.1"

int main(int argc, char *argv)

message = argv[1];

printf("message: %s\n", message);

sockfd = socket(af_inet, sock_stream, 0);

memset(&servaddr, '\0', sizeof(struct sockaddr_in));

servaddr.sin_family = af_inet;

inet_pton(af_inet, server_ip, &servaddr.sin_addr);

servaddr.sin_port = htons(server_port);

connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

write(sockfd, message, strlen(message));

n = read(sockfd, buf, sizeof(buf)-1);

if(n>0)else

printf("finished.\n");

close(sockfd);

return 0;

}

關於網路伺服器

假如我有數千萬甚至是上億的使用者資料,我想把使用者自增id和使用者名稱username放到快取裡。我的需求是,當要查詢使用者的資訊時,我想先從快取裡根據使用者名稱username獲取到使用者的id,然後再通過id在資料庫裡查詢使用者的資訊。我想當乙個使用者表達到上億的數量級別時,用自增id來查詢肯定...

網路伺服器宕機

1.伺服器程序終止 當伺服器程序終止時,伺服器傳送fin給客戶端,客戶端回以ack,客戶端進入close wait狀態,但還沒有結束連線。此時客戶端阻塞於fgets,客戶端繼續傳送buffer,伺服器傳送rst,客戶端readline返回0。而如果客戶端不理睬readline返回的rst,繼續wri...

linux網路伺服器

在本次中,學習了乙個簡單的基於tcp ip的伺服器 客戶端。在例子中,利用的是af inet域。在linux下,最常用就是af inet,af unix.af unix是linux檔案系統實現的本地要借字。後面的是可以用於包括英特網在內的tcp ip網路通訊的程式。下面來看乙個簡單的基於tcp ip...