實現回聲伺服器的客戶端伺服器程式,客戶端通過網路連線到伺服器,並傳送任意一串英文資訊,伺服器端接受資訊後,將每個字元轉換為大寫並回送給客戶端顯示。
本示例來自於動腦學院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...