linux socket編程:簡易客戶端與服務端

来源:https://www.cnblogs.com/ghostwu/archive/2018/01/08/8242052.html
-Advertisement-
Play Games

什麼是socket? socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。其實socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操 ...


什麼是socket?

socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。其實socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)

socket的作用是用於網路通訊,網路通訊一般指的是不同主機之間的進程通訊,比如我電腦上的qq和你電腦上的qq實現通訊,都是進程之間發送數據.

在本地用pid標識一個進程,在網路中,tcp/ip協議的網路層“ip地址”可以唯一標識網路中的主機,傳輸層的“協議+埠”可以唯一標識主機中的應用程式(進程)。(ip地址,協議,埠)就可以標識網路的進程了,網路中的進程通信就可以利用這個標誌與其它進程進行交互

socket服務端編程基本步驟:

1,創建套接字, 利用socket函數

2,綁定套接字: bind

3,監聽套件字: listen

4,accept,接收客戶端的連接,3次握手就發生在這個階段,  這個函數返回一個新的套接字

5,處理業務

socket客戶端:

1,創建套接字: socket

2,連接服務端: connect

3,處理業務

----------------------------------------------------------------------------------------------------------------------------------

服務端源碼:

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/socket.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <arpa/inet.h>
 7 #include <unistd.h>
 8 
 9 int main(int argc, char *argv[])
10 {
11     int sockfd = -1;
12     int bindres = -1;
13     int listenres = -1;
14 
15     sockfd = socket( AF_INET, SOCK_STREAM, 0 );
16     if ( -1 == sockfd ) {
17         perror( "sock created" );
18         exit( -1 );
19     }
20     
21     struct sockaddr_in server;    
22     memset( &server, 0, sizeof( struct sockaddr_in ) );
23     server.sin_family = AF_INET;
24     server.sin_port = 6666;
25     server.sin_addr.s_addr = htonl( INADDR_ANY );
26 
27     bindres = bind( sockfd, (struct sockaddr*)&server, sizeof( server ) );
28     if( -1 == bindres ) {
29         perror( "sock bind" );
30         exit( -1 );
31     }
32 
33     listenres = listen( sockfd, SOMAXCONN );
34     if( -1 == listenres ) {
35         perror( "sock listen" );
36         exit( -1 );
37     }
38     
39     struct sockaddr_in peerServer;
40     int acceptfd = -1;
41     socklen_t len = sizeof( peerServer );
42     acceptfd = accept( sockfd, (struct sockaddr*)&peerServer, &len );
43     if ( -1 == acceptfd ) {
44         perror( "sock accept" );
45         exit( -1 );
46     }
47 
48     char recvBuf[1024];    
49     while( 1 ) {
50         memset( recvBuf, 0, sizeof( recvBuf ) );
51         int recvBytes = read( acceptfd, recvBuf, sizeof( recvBuf ) );
52         fputs( recvBuf, stdout );
53         write( acceptfd,recvBuf, recvBytes );
54     }
55     
56     close( sockfd );
57     close( acceptfd );
58 
59     return 0;
60 }
View Code

客戶端源碼:

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/socket.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 #include <arpa/inet.h>
 7 #include <unistd.h>
 8 
 9 int main(int argc, char *argv[])
10 {
11     int sockfd = -1;
12 
13     sockfd = socket( AF_INET, SOCK_STREAM, 0 );
14     if ( -1 == sockfd ) {
15         perror( "sock created" );
16         exit( -1 );
17     }
18     
19     struct sockaddr_in server;    
20     memset( &server, 0, sizeof( struct sockaddr_in ) );
21     server.sin_family = AF_INET;
22     server.sin_port = 6666;
23     server.sin_addr.s_addr = inet_addr( "127.0.0.1" );
24     
25     int res = -1;    
26     res = connect( sockfd, (struct sockaddr*)&server, sizeof( server ) );
27     if( -1 == res ){
28         perror( "sock connect" );
29         exit( -1 );
30     }
31 
32     char sendBuf[1024] = { 0 };
33     char recvBuf[1024] = { 0 };
34     while( fgets( sendBuf, sizeof( sendBuf ), stdin ) != NULL ) {
35         write( sockfd, sendBuf, sizeof( sendBuf ) );
36         read( sockfd, recvBuf, sizeof( recvBuf ) );
37         fputs( recvBuf, stdout );
38         memset( sendBuf, 0, sizeof( sendBuf ) );
39         memset( recvBuf, 0, sizeof( recvBuf ) );
40     }
41 
42     close( sockfd );
43 
44     return 0;
45 }
View Code

備註:

1、socket函數的參數:當protocol為0時,會自動選擇type類型對應的預設協議

2、將sin_addr設置為INADDR_ANY"的含義是什麼?

轉換過來就是0.0.0.0,泛指本機的意思,也就是表示本機的所有IP,因為有些機子不止一塊網卡,多網卡的情況下,這個就表示所有網卡ip地址的意思。 比如一臺電腦有3塊網卡,分別連接三個網路,那麼這臺電腦就有3個ip地址了,如果某個應用程式需要監聽某個埠,那他要監聽哪個網卡地址的埠呢? 如果綁定某個具體的ip地址,你只能監聽你所設置的ip地址所在的網卡的埠,其它兩塊網卡無法監聽埠,如果我需要三個網卡都監聽,那就需要綁定3個ip,也就等於需要管理3個套接字進行數據交換,這樣豈不是很繁瑣? 所以出現INADDR_ANY,你只需綁定INADDR_ANY,管理一個套接字就行,不管數據是從哪個網卡過來的,只要是綁定的埠號過來的數據,都可以接收到

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • cp命令的基本用法: cp 源文件 目標文件 如果目標文件不存在 就創建, 如果存在就覆蓋 實現一個cp命令其實就是讀寫文件的操作: 對於源文件: 把內容全部讀取到緩存中,用到的函數read 對於目標文件: 把緩存中的內容全部寫入到目標文件,用到的函數creat 1 /* 2 * Copyright ...
  • Python基礎 對於Python,一切事物都是對象,對象基於類創建 所以,以下這些值都時對象:"zhurui"、22、['北京','上海','深圳'],並且是根據不同的類生成的對象。 一、基本數據類型 數字(int) 如:21、45、56 每一個整數都具備如下功能: 字元串(str) 1、name ...
  • 在上一章,我們添加了nor,nand啟動後,uboot啟動出如下圖所示: 上面的Flash: *** failed *** 是屬於uboot第二階段函數board_init_r()里的代碼, 代碼如下所示(位於arch/arm/lib/board.c): 從上面代碼看出, board_init_r( ...
  • Note: ‘小白’我本人的挖坑總結,記錄一次悲催自作孽的安裝過程 > 安裝基本Follow:http://www.linuxidc.com/Linux/2016-06/132051.htm > 一些區別 及 “踩坑”記錄: a. 註意下麵提示文字,版本不同進入編輯的指令也不同,eg:2017.8版 ...
  • who命令的作用用於顯示當前有哪些用戶登錄到系統。 這個命令執行的原理是讀取了系統上utmp文件中記錄的所有登錄信息,直接顯示出來的 utmp文件在哪裡呢? man who的時候,在手冊下麵有這麼一段說明:意思就是不指定文件參數,那麼讀取的就是/var/run/utmp,到底是不是,驗證下 當我指定 ...
  • 這一系列的Linux入門都是本人在《鳥哥的Linux私房菜》的基礎上總結的基本內容,主要是記錄下自己的學習過程,也方便大家簡要的瞭解 Linux Distribution是Ubuntu而不是書本上推薦的CentOS,建議裝雙系統,不要使用虛擬機。 代碼在github上:Linuxpractice 其 ...
  • 實戰環境: 公司計劃在年底做一次大型市場促銷活動,全面衝刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試,運維老大為了在年底有所表現,要求運維部門同事儘快實現,當你接到這個任務時,有沒有更快的解決方式? ...
  • 1.GPG簡介 1991年,程式員Phil Zimmermann為了避開政府的監視,開發了加密軟體PGP。因為這個軟體非常好用,迅速流傳開來成為許多程式員的必備工具。但是,它是商業軟不能自由使用。所以,自由軟體基金會決定,開發一個PGP的替代品取名為GnuPG,因此GPG就誕生了。GPG是GNU P ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...