1. 程式人生 > >【Linux】Linux網路程式設計基礎

【Linux】Linux網路程式設計基礎

1.什麼是TCP/IP,UDP
TCP/IP(Transmission Control Protocol/Internet Prococol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是為廣域網(Wans)設計的。
UDP(User Data Protocal,使用者資料協議)是與TCP相對應的協議。它屬於TCP/IP協議簇的一種。
下面的圖表表明了這些協議的關係。

2.Socket在哪裡呢?

3.Socket是什麼呢?
Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket

藉口後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
門面模式,用自己的話說,就是系統對外界提供一組單一的介面,外部不需要了解內部的實現。
4.有很多的框架,為什麼還在從Socket開始?
現在跨平臺網路程式設計框架很多,如JavaSSHC/C++Boost等。
現在的分散式框架有很多,如Hadoop等。
我的任務是把一個C/C++程式做成分散式,要求的不配環境,基本屬於純計算的,結果很小,所以選擇了Socket
重要的是Socket是一個分散式、雲端計算、網路程式設計的基礎,對Socket的學習有利於對其他框架的理解。
下圖是Socket
程式設計的基本流程:


5.Linux C Socket簡單例項與詳細註釋

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#define MYPORT 8887 #define QUEUE 20 #define BUFFER_SIZE 1024 int main() { ///定義sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); ///定義sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出錯返回-1 if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1) { perror("bind"); exit(1); } ///listen,成功返回0,出錯返回-1 if(listen(server_sockfd,QUEUE) == -1) { perror("listen"); exit(1); } ///客戶端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof(client_addr); ///成功返回非負描述字,出錯返回-1 int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length); if(conn<0) { perror("connect"); exit(1); } while(1) { memset(buffer,0,sizeof(buffer)); int len = recv(conn, buffer, sizeof(buffer),0); if(strcmp(buffer,"exit\n")==0) break; fputs(buffer, stdout); send(conn, buffer, len, 0); } close(conn); close(server_sockfd); return 0; }

客戶端:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define MYPORT  8887
#define BUFFER_SIZE 1024

int main()
{
    ///定義sockfd
    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);

    ///定義sockaddr_in
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(MYPORT);  ///伺服器埠
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  ///伺服器ip

    ///連線伺服器,成功返回0,錯誤返回-1
    if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("connect");
        exit(1);
    }

    char sendbuf[BUFFER_SIZE];
    char recvbuf[BUFFER_SIZE];
    while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
    {
        send(sock_cli, sendbuf, strlen(sendbuf),0); ///傳送
        if(strcmp(sendbuf,"exit\n")==0)
            break;
        recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
        fputs(recvbuf, stdout);

        memset(sendbuf, 0, sizeof(sendbuf));
        memset(recvbuf, 0, sizeof(recvbuf));
    }

    close(sock_cli);
    return 0;
}

執行:
客戶端

伺服器

相關推薦

Linux C/C++網路程式設計基礎 TCP簡單實現

簡單的linux下socket程式設計,分別基於TCP協議實現的簡單程式linux下socket程式設計可以概括為以下幾個函式的運用:socket()bind()listen()connect()accept()read()write()close()函式server端/*

Learning-Python29網路程式設計之粘包

粘包問題   上一篇部落格遺留了一個問題,在接收的最大位元組數設定為 1024 時,當接收的結果大於1024,再執行下一條命令時還是會返回上一條命令未執行完成的結果。這就是粘包問題。   因為TCP協議又叫流式協議,每次傳送給客戶端的資料實際上是傳送到客戶端所在作業系統的快取上,客戶端就是一個應用程式,需

施工ing整理python---各種程式設計基礎概念---辨析整理

程式:程式只是基於“使用者輸入”而“執行的動作的一些指令”的集合。 Python裡只有3種不同的指令: (1)表示式:expression             由操作符連線的值      

PythonTCP網路程式設計

【Python TCP網路使用】 注意: 必須先啟動伺服器!!!不然會報錯 import socket; def LanJian_TcpClient(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM)

SocketJava Socket程式設計基礎及深入講解

Socket是Java網路程式設計的基礎,瞭解還是有好處的,   這篇文章主要講解Socket的基礎程式設計。Socket用在哪呢,主要用在程序間,網路間通訊。本篇比較長,特別做了個目錄: 一、Socket通訊基本示例   這種模式是基礎,必須掌

unpunix網路程式設計卷1-->環境搭建(ubuntu14.04)

學習unp網路程式設計,樹上的例子均存在#include "unp.h",故需要對環境進行配置。 2. 解壓並將unpv13e 移動到相應的資料夾下 3. 編譯 >$ cd unpv13e

SocketJava Socket程式設計基礎及深入講解(轉載)

Socket是Java網路程式設計的基礎,瞭解還是有好處的,   這篇文章主要講解Socket的基礎程式設計。Socket用在哪呢,主要用在程序間,網路間通訊。本篇比較長,特別做了個目錄: 一、Socket通訊基本示例   這種模式是基礎,必須掌握,後

C++泛型程式設計基礎:模板通識

測試環境: Target: x86_64-linux-gnu gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)什麼是泛型程式設計?為什麼C++會有模板?這一切的一切都要從如何編寫一個通用的加法函式說起。 很久很久

LinuxLinux網路程式設計基礎

1.什麼是TCP/IP,UDP TCP/IP(Transmission Control Protocol/Internet Prococol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是為廣

基於linux環境tcp網路程式設計(線上英英詞典)文件2

程式碼: client.c /************************************************************************* File Name: client.c Author: Young

Linux 網路程式設計TCP網路程式設計中connect()、listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: connect()函式:對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連接的過程是由核心完成,不是這個函式完成的,這個函式的作用僅僅是通知 Linux 核心

LinuxLinux網路程式設計(含常見伺服器模型,下篇)

高階巢狀字函式 前面介紹的一些函式(read、write等)都是網路程式裡最基本的函式,也是最原始的通訊函式。下面介紹一下幾個網路程式設計的高階函式: recv()函式 int recv(int s, void *buf, int len, unsigned i

LinuxLinux網路程式設計(含常見伺服器模型,上篇)

基本資料結構介紹 Linux系統是通過提供巢狀字(socket)來進行網路程式設計的。網路程式通過socket和其他幾個函式的呼叫,會返回一個通用的檔案描述符,使用者可以將這個描述符看成普通的檔案的描述符來操作,這就是Linux的裝置無關性的好處。使用者可以通過向描述符的讀

Linux下的TCP/IP程式設計----多播和廣播的實現 轉載Linux下的TCP/IP程式設計----多播和廣播的實現

【轉載】 出處:https://blog.csdn.net/wqc_CSDN/article/details/51588769 【轉載】Linux下的TCP/IP程式設計----多播和廣播的實現

網路程式設計基礎day08:簡單socket例項(二)

本節內容 1、概述 2、socket例項 3、總結 一、概述   之前我們只是介紹了soket的概念和一些邏輯圖表,下面我們來看看,socket的客戶端和服務端到底是怎麼用的? 二、socket例項 2.1 客戶端 2.1.1 客戶端程式碼邏輯圖 2.1.2 客戶端程式碼

網路程式設計基礎day09:socket接收大資料(五)

本節內容 1、概述 2、socket接收大資料 3、中文字元的坑 一、概述   上篇部落格寫到了,就是說當伺服器傳送至客戶端的資料,大於客戶端設定的資料,則就會把資料服務端發過來的資料剩餘資料存在IO緩衝區中,那我們如何解決這個問題呢?   有的同學就說了: 改大客戶端接收的資料的大小=&

網路程式設計基礎day09:socket解決粘包問題之MD5(八)

本節內容 1、概述 2、程式碼實現 一、概述   上一篇部落格講到的用MD5來校驗還是用的之前解決粘包的方法,就是客戶端傳送一個請求,等待服務端的確認的這樣的一個笨方法。下面我們用另外一種方法:就是客戶端已經知道可接收多少資料了,既然客戶端已經知道接收多少資料了,那麼客戶端在接收資料的時候,正好接收已

網路程式設計基礎day10:我是一個程序(三)

一、引子 我聽說我的祖先們生活在專用計算機裡, 一生只幫助人類做一件事情,比說微積分運算 了、人口統計了 、生成密碼、甚至通過織布機印花 !   如果你想在這些專用“計算機”上乾點別的事兒,例如安裝個遊戲玩玩, 那是絕對不可能的, 除非你把它拆掉, 然後建一個全新的機器。  

網路程式設計基礎day10:我是一個執行緒(四)

本節內容 1、第一回 初生牛犢 2、第二回 漸入佳境 3、第三回 虎口脫險 4、第四回 江湖再見 第一回 初生牛犢 我是一個執行緒,我一出生就被編了個號:0x3704,然後被領到一個昏暗的屋子裡,在這裡我發現了很多和我一模一樣的同伴。 我身邊的同伴0x6900 待的時間比較長,他帶著滄桑的口氣對

網路程式設計基礎day10:作業系統介紹

一、為什麼要有作業系統 現代的計算機系統主要是由一個或者多個處理器,主存,硬碟,鍵盤,滑鼠,顯示器,印表機,網路介面及其他輸入輸出裝置組成。 一般而言,現代計算機系統是一個複雜的系統。 其一:如果每位應用程式設計師都必須掌握該系統所有的細節,那就不可能再編寫程式碼了(嚴重影響了程式設計師的開發效率:全部