1. 程式人生 > >一個簡單的伺服器與客戶端程式

一個簡單的伺服器與客戶端程式

最近在學習《深入理解計算機系統》,看到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

AndroidJava 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) {