原创 linux網絡編程之socket(七):一個進程發起多個連接和gethostbyname等函數

一、在前面講過的最簡單的回射客戶/服務器程序中,一個客戶端即一個進程,只會發起一個連接,只要稍微修改一下就可以讓一個客戶端發起多個連 接,然後只利用其中一個連接發送數據。 先來認識一個函數getsockname   #inc

原创 c 枚舉類型詳解

在實際編程中,有些數據的取值往往是有限的,只能是非常少量的整數,並且最好爲每個值都取一個名字,以方便在後續代碼中使用,比如一個星期只有七天,一年只有十二個月,一個班每週有六門課程等。以每週七天爲例,我們可以使用#define命令來給每天指

原创 C++構造函數、拷貝構造函數、賦值函數淺析

C++中一般創建對象,拷貝或賦值的方式有構造函數,拷貝構造函數,賦值函數這三種方法。下面就詳細比較下三者之間的區別以及它們的具體實現 1.構造函數 構造函數是一種特殊的類成員函數,是當創建一個類的對象時,它被調用來對類的數據成員進行

原创 STM32 HAL庫、標準外設庫、LL庫(STM32 Embedded Software)

STM32 Embedded Software   工作以來一直使用ST的STM32系列芯片,ST爲開發者提供了非常方便的開發庫。到目前爲止,有標準外設庫(STD庫)、HAL庫、LL庫 三種。前兩者都是常用的庫,後面的LL庫是ST最

原创 linux網絡編程之socket(六):利用recv和readn函數實現readline函數

在前面的文章中,我們爲了避免粘包問題,實現了一個readn函數讀取固定字節的數據。如果應用層協議的各字段長度固定,用readn來讀是非常方便 的。例如設計一種客戶端上傳文件的協議,規定前12字節表示文件名,超過12字節的文件名截斷,

原创 網絡中進程間的通信

進 程通信的概念最初來源於單機系統。由於每個進程都在自己的地址範圍內運行,爲保證兩個相互通信的進程之間既互不干擾又協調一致工作,操作系統爲進程通信提供了相應設施,如UNIX BSD有:管道(pipe)、命名管道(named pipe

原创 linux網絡編程之socket(四):使用fork併發處理多個client的請求和對等通信p2p

一、在前面講過的回射客戶/服務器程序中,服務器只能處理一個客戶端的請求,如何同時服務多個客戶端呢?在未講到select/poll/epoll等高級IO之前,比較老土的辦法是使用fork來實現。網絡服務器通常用fork來同時服務多個

原创 IP和端口間的聯繫

TCP/IP協議中的端口指的是什麼呢? 如果把IP地址比作一間房子 ,端口就是出入這間房子的門。真正的房子只有幾個門,但是一個IP地址的端口可以有65536個之多!端口是通過端口號來標記的,端口號只有整數,範圍是從0 到65535。

原创 scanf()函數用法

雖然有人說在大型程序設計中永遠不要使用scanf(),但是對於習慣用C的人和參加ACM/ICPC的人,scanf()還是用的比較多的,而且用好了用起來也很方便。   下面整理一點兒平時常需要用到而可能有些人一直理不清的一些知識   一般

原创 C語言 volatile 關鍵字

volatile提醒編譯器它後面所定義的變量隨時都有可能改變,因此編譯後的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數據。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個

原创 linux網絡編程之socket(三):最簡單的回射客戶/服務器程序、time_wait 狀態

下面通過最簡單的客戶端/服務器程序的實例來學習socket API。 echoser.c 程序的功能是從客戶端讀取字符然後直接回射回去。  C++ Code  1 2 3 4 5 6 7 8 9 10 11 1

原创 C語言條件編譯與預處理

一、C語言由源代碼生成的各階段如下: C源程序->編譯預處理->編譯->優化程序->彙編程序->鏈接程序->可執行文件     其中 編譯預處理階段,讀取c源程序,對其中的僞指令(以#開頭的指令)和特殊符號進行處理。或者說是掃描源代

原创 linux網絡編程之socket(一):socket概述和字節序、地址轉換函數

一、什麼是socket socket可以看成是用戶進程與內核網絡協議棧的編程接口。 socket不僅可以用於本機的進程間通信,還可以用於網絡上不同主機的進程間通信。 socket API是一層抽象的網絡編程接口,適用於各種底層

原创 linux網絡編程之socket(二):C/S程序的一般流程和基本socket函數

一、基於TCP協議的網絡程序 下圖是基於TCP協議的客戶端/服務器程序的一般流程: 服務器調用socket()、bind()、listen()完成初始化後,調用accept()阻塞等待,處於監聽端口的狀態,客戶端調用sock

原创 linux網絡編程之socket(五):tcp流協議產生的粘包問題和解決方案

我們在前面曾經說過,發送端可以是一K一K地發送數據,而接收端的應用程序可以兩K兩K地提走數據,當然也有可能一次提走3K或6K數據,或者一次只提走幾個字節的數據,也就是說,應用程序所看到的數據是一個整體,或說是一個流(stream),一