一個簡單的伺服器與客戶端程式
最近在學習《深入理解計算機系統》,看到linux系統級的IO以及,socket通訊,所以乾脆參考書上例程,自己著手寫一個客戶端與伺服器的小程式。
並未使用csapp封裝好的open_clientfd與open_listenfd還有RIO包
主要功能就兩個:
1.伺服器讀客戶端送入的字串,並通知客戶端已經收到。
2.客戶端能主動退出連線。
寫這個小程式是為了練習socket通訊的步驟。
伺服器:
socket函式建立套接字
bind將socket建立的套接字與伺服器套接字繫結
listen開啟監聽套接字
accept等待客戶端connect //會阻塞
客戶端:
socket建立套接字
connect將套接字與伺服器ip地址繫結,建立Internet連線
之後客戶端與伺服器就能用各自的套接字,通過linux系統IO通訊了!
執行的時候,客戶端後需加伺服器ip與埠,伺服器需加開啟的埠,分別為main函式引數
值得注意的是linux系統IO read預設情況下是阻塞的
伺服器程式碼:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <string.h> int echo(int connfd){ char *exit = "exit is getted"; write(connfd, "Please input", 100); while(1){ char client_word[100]; read(connfd, client_word, 100); printf("%s \n", client_word); strcat(client_word, " is getted"); write(connfd, client_word, 100); if(strcmp(client_word, exit) == 0){ printf("client exit\n"); return 1; }else{ continue; } } } int main(int argc, char **argv){ int port, listenfd, connfd, clientlen; struct sockaddr_in clientadder; struct hostent *hp; port = atoi(argv[1]); if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){//建立伺服器套接字 printf( "socket error\n" ); } clientadder.sin_family = AF_INET;//填充資訊 clientadder.sin_addr.s_addr = htonl(INADDR_ANY); clientadder.sin_port = htons(port); if(bind(listenfd, (struct sockaddr *)&clientadder, sizeof(clientadder)) < 0){//繫結 printf( "bind error\n" ); } if (listen(listenfd, 1024) < 0){//通知核心此套接字為伺服器使用 printf( "listen error\n" ); } while(1){ printf( "wait for client\n" ); clientlen = sizeof(clientadder); if((connfd = accept(listenfd, (struct sockaddr *)&clientadder, &clientlen)) < 0){//監聽 printf( "accept error\n" ); }else{ printf("connect successful!\n"); if (echo(connfd)){ printf("exit from echo\n"); }else{ printf("error from echo\n"); } } write(connfd, "exit", 100); close(connfd); } printf("gg\n"); }
客戶端程式碼:
#include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <unistd.h> #include <string.h> int main(int argc, char **argv){ int port,clientfd; struct hostent *hp; char *EXIT = "exit is getted"; struct sockaddr_in serveraddr; port = atoi(argv[2]); if((hp = gethostbyname(argv[1])) == NULL){ //通過ip地址獲取目的主機資訊 printf("ip error\n"); } if((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ //建立客戶端套接字 printf("socket error\n"); } bcopy((char *)hp->h_addr_list[0], (char *)&serveraddr.sin_addr.s_addr, hp->h_length);//填充資訊 serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(port); if(connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0){//建立連線 printf("connect error\n"); }else{ printf("connect successful!\n"); while(1){ char buf[100]; char get[100]; read(clientfd, get, 100); if(strcmp(get, EXIT) == 0){ printf("server exit\n"); close(clientfd); return 0; } printf("%s \n", get); scanf("%s", buf); write(clientfd, buf, 100); } } return 0; }
通過查閱其他資料得知:
struct sockaddr是通用的套接字地址,而struct sockaddr_in則是internet環境下套接字的地址形式,二者長度一樣,都是16個位元組。
二者是並列結構,指向sockaddr_in結構的指標也可以指向sockaddr。
一般情況下,需要把sockaddr_in結構強制轉換成sockaddr結構再傳入系統呼叫函式中。
這樣就穩了~
相關推薦
一個簡單的伺服器與客戶端程式
最近在學習《深入理解計算機系統》,看到linux系統級的IO以及,socket通訊,所以乾脆參考書上例程,自己著手寫一個客戶端與伺服器的小程式。 並未使用csapp封裝好的open_clientfd與open_listenfd還有RIO包 主要功能就兩個: 1.伺服器讀客戶
簡單伺服器與客戶端互動(例項:簡單揹包)
//伺服器端程式碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst
【隨堂筆記】unity中socket的用法(二、伺服器與客戶端之間簡單的資料傳遞)
主要實現伺服器與客戶端之間簡單的資料傳輸(單次) 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program {
【隨堂筆記】unity開發中Socket的用法(一,實現伺服器與客戶端簡單的連結)
實現了簡單的連結,也增加了客戶端沒有連結到伺服器的自動重連 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program
C#.網路程式設計 Socket基礎(一)Socket TCP協議 實現端到端(伺服器與客戶端)簡單字串通訊
簡介: 本章節主要討論了Socket的入門知識,還未針對Socket的難點問題(比如TCP的無訊息邊界問題)展開討論,往後在其他章節中進行研究。 注意點: 伺服器(比如臺式電腦)的IP為1.1.1.2,那麼客戶端(其他裝置,比如手機,Ipad)連線的一定是
Java網路 伺服器與客戶端的簡單通訊
不登高山,不知天之高也。不臨深淵,不知地之厚也。 Java中的封裝類(Socket),在實現這個功能的時候,需要對Java中的Socket套接字的一些用法熟悉,伺服器與客戶端之間主要通過的Java中的IO流通訊。需要理解IO流的流出,流入問題。 接下來,
一個帖子解決伺服器與客戶端傳遞物件的問題,JSON解析兩種方法
只要你對JSON有一點了解,以下內容就非常容易理解,閒話少說,直接上程式碼 **方法一**JSONObject 方法解析物件進行傳遞 先寫伺服器端的程式碼,先寫一個person物件 public class Person { private
Java實現簡單的Socket伺服器與客戶端字串通訊(適合初學者閱讀)
近段時間,頻繁看到很多學生做畢業設計用到了Socket通訊技術,問題非常多,特寫一個小例子,希望對馬上畢業的同學有所幫助。如果希望學習的更加深入,需要掌握的知識有:面向物件、多執行緒、Socket通訊、IO流、異常處理 伺服器端程式碼: import java
Linux下簡單的網路程式設計筆記(模擬簡單的伺服器與客戶端的通訊 1-伺服器端)
一.伺服器端 (一).建立連線的條件:伺服器必須處於監聽狀態,由客戶端發起連線請求 bind之前可新增以下程式碼解決關閉伺服器後端口仍被佔用的問題 // 設定套接字選項避免地址使用錯誤 int on=1; if((setsoc
Android與Java NIO實現簡單Echo伺服器與客戶端
上一篇用Java IO來做了個Demo,於是乎進一步,用Java NIO來做一個。NIO的優勢在於非阻塞。使用了Selector在一個執行緒裡進行輪詢,就能夠完成接入、收\發訊息的操作,不需要每建立一個連線都新啟動一個執行緒的方式。Server端程式碼:public clas
linux下的簡單檔案伺服器和客戶端程式
本文是我的一次作業,由於花了很多精力,記下來以後可能還會用到。程式碼部分是從老師那拷貝的,作業是實現程式碼中沒有實現的put和delete命令對檔案的操作。我對程式碼的理解都做了標註,有點亂,但閱讀方便。本程式的命令要求 Dir/ls 後接字串,列出伺服器的某個目錄的內容
socket程式設計(一),實現伺服器與客戶端簡單通訊
本節主講客戶端向服務傳送資訊,伺服器轉發給客戶端,當然也可以稍微改一下程式碼可以實現互傳訊息,不再贅述。 難點在於伺服器端的程式碼思路: (1)主程式Socket socket=server.acc
C# Socket簡單例子(伺服器與客戶端通訊)
這個例子只是簡單實現瞭如何使用 Socket 類實現面向連線的通訊。注意:此例子的目的只是為了說明用套接字寫程式的大概思路,而不是實際專案中的使用程式。在這個例子中,實際上還有很多問題沒有解決,如訊息邊界問題、埠號是否被佔用、訊息命令的解析問題等。。下面是兩個程式的程式碼,(
一個基於TCP/IP的伺服器與客戶端通訊的小專案(超詳細版)
1.目的:實現客戶端向伺服器傳送資料 原理: 2.建立兩個控制檯應用,一個為伺服器,用於接收資料。一個為客戶端,用於傳送資料。 關鍵類與對應方法: 1)類IPEndPoint: 1.是抽象類EndPoint的實現類 2.So
二、Netty實現伺服器與客戶端完整互動連線實戰
本節內容是程式碼實現伺服器與客戶端完整連線過程。整體把控netty的工作流程。我們先不要被某個類,某個api的封裝深入挖掘,這樣你會踩很多坑,陷入進去而拔不出來,後面我會一一講解,原始碼剖析工作原理。這就是我個人學習技術的一種方法,深入淺出
C#Socket通訊基礎(非同步Socket通訊TCP)伺服器與客戶端
一、效果圖 二、伺服器端程式碼(原始碼下載地址:https://download.csdn.net/download/xiaochenxihua/10748789) using System; using System.Collections.Generic; using System
webservice伺服器與客戶端
微信公眾號:明之Java 知識星球:https://t.zsxq.com/JEemUnm 碼雲專案地址:https://gitee.com/mingprogram/livesys 1、實現WebServiceImpl類,注意添加註解 @WebService ,方法新增@WebMet
支援 Appium 伺服器的客戶端程式庫列表
這些庫封裝了標準的 Selenium 客戶端,提供了所有 JSON Wire protocol 指定的常規 selenium 命令,額外新增操控移動裝置相關的命令,例如 多點觸控手勢 和 螢幕方向。 Appium 客戶端程式庫實現了 M
後臺開發閱讀筆記——伺服器與客戶端
伺服器: 伺服器收到客戶端發來的請求資料,解析請求資料後處理,最後返回結果。接收請求的方式可以是通過TCP請求包,也可以是HTTP請求包(也是TCP連線)。若是TCP請求,常見的為二進位制格式;若是HTTP方式,請求包格式一般是JSON或者XML格式,或是自定義的ASCII文字。 客
為什麼從伺服器與客戶端不能接收訊息NetMQ框架?
最近,我使用NetMQ傳送或接收伺服器和客戶端之間的訊息。 伺服器密碼: void Main() { CreatePullAndPushSocket(); Task.Factory.StartNew(()=> { while (true) {