国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。

這篇具有很好參考價值的文章主要介紹了Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.前言

回顧之前進程間通信(無名管道,有名管道,消息隊列,共享內(nèi)存,信號,信號量),都是在同一主機由內(nèi)核來完成的通信。

那不同主機間該怎么通信呢?

可以使用Socket編程來實現(xiàn)。

Socket編程可以通過網(wǎng)絡(luò)來實現(xiàn)實現(xiàn)不同主機之間的通訊。

二.Socket編程的網(wǎng)絡(luò)模型如下。

Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。

1.創(chuàng)建socket

創(chuàng)建通訊套接字

int socket(int domain, int type, int protocol);
//參數(shù)一:是通信時候用的協(xié)議族
//?AF_UNIX, AF_LOCAL      用于本地進程/線程的網(wǎng)絡(luò)通信
//AF_INET? ? ? ? ? ? ? ? ?用于IPV4的網(wǎng)絡(luò)通信
//AF_INET6? ? ? ? ? ? ? ? 用于IPV6的網(wǎng)絡(luò)通信
//參數(shù)二:為sockt的類型
//SOCK_STREAM? ? ? ? ? ?  流水式socket,對應的是TCP
//SOCK_DGRAM? ? ? ? ? ? ? 數(shù)據(jù)報式socket 對應的是UDP
//參數(shù)三:通常填零

3.綁定socket/端口號

綁定IP地址端口號等。

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//參數(shù)一:為創(chuàng)建socket返回的標識符
//參數(shù)二:為一個struct sockaddr *addr的指針結(jié)構(gòu)體,里面包含了,IP地址和端口號,網(wǎng)絡(luò)編程是一般使用的是struct sockaddr_in類型的。
// struct sockaddr_in 
//   {       
//       u_short sin_family;      // 地址族, AF_INET   
//       u_short sin_port;        // 端口號 
//      struct in_addr sin_addr; // IPV4地址      
//   char sin_zero[8];        // 8 bytes unused,作為填充
//    }; 
//如果使用了struct sockaddr_in類型的,左后一定要強轉(zhuǎn)成struct sockaddr *addr類型的。
//參數(shù)三:為大小,sizeof

4.監(jiān)聽端口號

函數(shù)原型如下

 int listen(int sockfd, int backlog);
//參數(shù)一:為創(chuàng)建socket返回的文件描述符
//參數(shù)e二:為能

5.接受客戶端的連接請求

程序運行后服務(wù)器會一直阻塞在這 等待客戶端發(fā)送連接請求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//參數(shù)一:為創(chuàng)建socket返回的文件描述符
//參數(shù)二:struct sockaddr類型的指針,用來存放端口號和IP地址
//參數(shù)三:為大小sizeof

6.請求服務(wù)器連接(客戶端)

向服務(wù)器發(fā)送連接請求。

 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//參數(shù)一:為創(chuàng)建socket返回的文件描述符
//參數(shù)二:struct sockaddr類型的指針,用來存放端口號和IP地址
//參數(shù)三:為結(jié)構(gòu)體大小

7.讀取/寫入

連接成功后開始信息的交互,可以使用循環(huán),讓交互不退出去

 ssize_t read(int fd, void *buf, size_t count);
//參數(shù)一:文件描述符
//參數(shù)二:緩沖區(qū)
//參數(shù)san:讀取的大小
ssize_t write(int fd, const void *buf, size_t count);
//參數(shù)與read出不多

8.關(guān)閉文件

通訊完畢,關(guān)閉文件

int close(int fd);
//參數(shù):你要關(guān)閉哪個文件就寫哪個文件的文件描述符

三.示例代碼

1.server.c

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

int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    struct sockaddr_in addr2;
    memset(&addr,0,sizeof(struct sockaddr_in));
    memset(&addr2,0,sizeof(struct sockaddr_in));
    char *readbuf = (char *)malloc(sizeof(struct sockaddr_in)*10);
    char mas[128] ={0};
    int cockfd;
    int sockfd;
    int nread;
 
    if(argc != 3)//判斷輸入的參數(shù)是否等于3
    {
        printf("param not good\n");
        exit(-1);
    }
    
    
    if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)//創(chuàng)建Socket,使用IPV4,TCP類型
    {
        printf("creat socket faild\n");
    }

    
    addr.sin_family = AF_INET;      // 地址族, AF_INET,2 bytes    
    addr.sin_port = htons(atoi(argv[2]));     // 端口,2 bytes        
    inet_aton(argv[1],&addr.sin_addr);//使用inet_aton函數(shù)將IP地址轉(zhuǎn)換為網(wǎng)絡(luò)序列。
    bind(sockfd,(struct sockaddr*)&addr,sizeof(sockaddr_in));

    listen(sockfd,10);//監(jiān)聽
    while(1)
    {
? ? ? ? //嘗試連接
         cockfd = accept(sockfd,(struct sockaddr*)&addr2,sizeof(sockaddr_in));
? ? ? ? ?if(cockfd == -1)
? ? ? ?  {
? ? ? ? ? ? perror("why");//失敗打印原因。
? ? ? ? ?}
         printf("get conset :  %s\n",inet_nota(addr2.sin_addr));//打印連接成功的IP地址

    ? ? //創(chuàng)建進程,讓同時維護,讀和寫
        if(fork() == 0)
        {
            while(1)
            {
                memset(readbuf,0,malloc_usable_size(readbuf))//每次通訊完成,內(nèi)容置為0
                nread = read(cockfd,readbuf,malloc_usable_size(readbuf));//讀取信息
                printf(" get message : %s\n",readbuf);//輸出讀取的內(nèi)容
            }

            if(fork() == 0)子進程在創(chuàng)建一個子進程讓同時運行讀和寫
            {
                while(1)
                {
                    memset(msg,0,sizeof(msg));//每次運行前把數(shù)組初始化
                    printf("please input\n");
                    gets(msg);//獲取信息       
                    write(cockfd,msg,strlen(msg));寫入信息
                }
            }
         }
    }
    return 0;   
}

示例代碼

2.client.c

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

int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(struct sockaddr_in));
    char *readbuf = (char *)malloc(sizeof(struct sockaddr_in)*10);
    char mas[128] ={0};
    int cockfd;
    int sockfd;
    int nread;
 
    if(argc != 3)
    {
        printf("param not good\n");
        exit(-1);
    }
    
    
    ifcockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
    {
        printf("creat socket faild\n");
    }

    
    addr.sin_family = AF_INET;      // 地址族, AF_INET,2 bytes    
    addr.sin_port = htons(atoi(argv[2]));     // 端口,2 bytes        
    inet_aton(argv[1],&addr.sin_addr);//使用inet_aton函數(shù)將IP地址轉(zhuǎn)換為網(wǎng)絡(luò)序列。
   
    connect(cockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr));//請求連接
    while(1)/
    {   
        if(fork() == 0)//創(chuàng)建進程,同時維護讀寫
        {
            while(1)
            {
                memset(readbuf,0,malloc_usable_size(readbuf))
                nread = read(cockfd,readbuf,malloc_usable_size(readbuf));//讀取內(nèi)容
                printf(" get message : %s\n",readbuf);//打印讀取到的內(nèi)容
            }

            if(fork() == 0)
            {
                while(1)
                {
                    memset(msg,0,sizeof(msg));
                    printf("please input\n");
                    gets(msg);    //獲取信息   
                    write(cockfd,msg,strlen(msg));//寫入信息
                }
            }
         }
    }
    return 0;   
}

以上就是我這段時間以來對網(wǎng)絡(luò)編程的學習和理解,順便記錄一下,希望對你們會有所幫助,如果有不對的地方,歡迎大家來指導,謝謝文章來源地址http://www.zghlxwxcb.cn/news/detail-476015.html

到了這里,關(guān)于Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實現(xiàn)Hello Word服務(wù)器端和客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實現(xiàn)Hello Word服務(wù)器端和客戶端

    目錄 1--Hello Word服務(wù)器端 2--客戶端 3--編譯運行 3-1--編譯服務(wù)器端 3-2--編譯客戶端 3-3--運行 運行結(jié)果:

    2024年02月10日
    瀏覽(62)
  • 【網(wǎng)絡(luò)編程】(TCP流套接字編程 ServerSocket API Socket API 手寫TCP版本的回顯服務(wù)器 TCP中的長短連接)

    【網(wǎng)絡(luò)編程】(TCP流套接字編程 ServerSocket API Socket API 手寫TCP版本的回顯服務(wù)器 TCP中的長短連接)

    TCP提供的API主要是兩個類:ServerSocket 和 Socket . TCP不需要一個類來表示\\\"TCP數(shù)據(jù)報\\\"因為TCP不是以數(shù)據(jù)報為單位進行傳輸?shù)?是以字節(jié)的方式,流式傳輸 ServerSocket API ServerSocket 是專門給服務(wù)器使用的Socket對象. ServerSocket 構(gòu)造方法: ServerSocket(int port) 創(chuàng)建一個服務(wù)端流套接字Socket,并綁

    2024年02月12日
    瀏覽(34)
  • TCP IP網(wǎng)絡(luò)編程(四) 基于TCP的服務(wù)器端、客戶端

    TCP IP網(wǎng)絡(luò)編程(四) 基于TCP的服務(wù)器端、客戶端

    TCP/IP協(xié)議棧 ? TCP/IP協(xié)議棧 TCP/IP協(xié)議棧共分為4層,可以理解為數(shù)據(jù)收發(fā)分成了4個層次化過程。 ? TCP協(xié)議棧 ? UDP協(xié)議棧 鏈路層 鏈路層是物理連接領(lǐng)域標準化的結(jié)果,也是最基本的領(lǐng)域,專門定義LAN、WAN、MAN等網(wǎng)絡(luò)標準。兩臺主機通過網(wǎng)絡(luò)進行數(shù)據(jù)交換,這需要像下圖所示

    2024年01月16日
    瀏覽(18)
  • TCP IP網(wǎng)絡(luò)編程(五) 基于TCP的服務(wù)器端、客戶端 (補充)

    TCP IP網(wǎng)絡(luò)編程(五) 基于TCP的服務(wù)器端、客戶端 (補充)

    回聲客戶端出現(xiàn)的問題 在上一節(jié)基于TCP的服務(wù)器端、回聲客戶端中,存在問題: 如果數(shù)據(jù)太大,操作系統(tǒng)就有可能把數(shù)據(jù)分成多個數(shù)據(jù)包發(fā)送到客戶端,客戶端有可能在尚未收到全部數(shù)據(jù)包時就調(diào)用read函數(shù) 問題出在客戶端,而不是服務(wù)器端,先來對比一下客戶端與服務(wù)器端

    2024年02月09日
    瀏覽(37)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端

    目錄 1--TCP/IP協(xié)議棧 2--TCP服務(wù)器端默認函數(shù)調(diào)用順序 3--TCP客戶端的默認函數(shù)調(diào)用順序 4--Linux實現(xiàn)迭代回聲服務(wù)器端/客戶端 5--Windows實現(xiàn)迭代回聲服務(wù)器端/客戶端 6--TCP原理 7--Windows實現(xiàn)計算器服務(wù)器端/客戶端 ????????TCP/IP協(xié)議棧共分 4 層,可以理解為數(shù)據(jù)收發(fā)分成了 4 個層

    2024年02月10日
    瀏覽(29)
  • python網(wǎng)絡(luò)編程:通過socket實現(xiàn)TCP客戶端和服務(wù)端

    python網(wǎng)絡(luò)編程:通過socket實現(xiàn)TCP客戶端和服務(wù)端

    目錄 寫在開頭 socket服務(wù)端(基礎(chǔ)) socket客戶端(基礎(chǔ)) 服務(wù)端實現(xiàn)(可連接多個客戶端)? 客戶端實現(xiàn) 數(shù)據(jù)收發(fā)效果 ? 近期可能會用python實現(xiàn)一些網(wǎng)絡(luò)安全工具,涉及到許多關(guān)于網(wǎng)絡(luò)的知識,逃不過的就是最基本的socket。本文將介紹如何通過python自帶的socket庫實現(xiàn)TCP客戶

    2024年03月21日
    瀏覽(27)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    目錄 1--TCP和UDP的主要區(qū)別 2--基于 UDP 的數(shù)據(jù) I/O 函數(shù) 3--基于 UDP 的回聲服務(wù)器端/客戶端 4--UDP客戶端Socket的地址分配 5--UDP存在數(shù)據(jù)邊界 6--UDP已連接與未連接的設(shè)置 ① TCP 提供的是可靠數(shù)據(jù)傳輸服務(wù),而 UDP 提供的是不可靠數(shù)據(jù)傳輸服務(wù); ② UDP 在結(jié)構(gòu)上比 TCP 更簡潔,其不會

    2024年02月09日
    瀏覽(53)
  • 【Java】網(wǎng)絡(luò)編程與Socket套接字、UDP編程和TCP編程實現(xiàn)客戶端和服務(wù)端通信

    【Java】網(wǎng)絡(luò)編程與Socket套接字、UDP編程和TCP編程實現(xiàn)客戶端和服務(wù)端通信

    為什么需要網(wǎng)絡(luò)編程? 現(xiàn)在網(wǎng)絡(luò)普及程序越來越高,網(wǎng)絡(luò)上保存著我們?nèi)粘I钪行枰母鞣N資源,使用程序通過網(wǎng)絡(luò)來獲取這些資源的過程就需要網(wǎng)絡(luò)編程來實現(xiàn)。 什么是網(wǎng)絡(luò)編程? 網(wǎng)絡(luò)編程,指網(wǎng)絡(luò)上的主機,通過不同的進程以程序的方式實現(xiàn)網(wǎng)絡(luò)通信(網(wǎng)絡(luò)數(shù)據(jù)傳輸)

    2024年02月17日
    瀏覽(90)
  • Linux網(wǎng)絡(luò)編程:Socket服務(wù)器和客戶端實現(xiàn)雙方通信

    Linux網(wǎng)絡(luò)編程:Socket服務(wù)器和客戶端實現(xiàn)雙方通信

    目錄 一,什么是網(wǎng)絡(luò)編程 二,為什么使用端口號 三,TCP協(xié)議與UDP協(xié)議 ①TCP(傳輸控制協(xié)議) ②UDP(用戶數(shù)據(jù)報協(xié)議,User Data Protocol) ③總結(jié)歸納 四,Socket服務(wù)器和客戶端的開發(fā)流程 五,服務(wù)器和客戶端相關(guān)API說明 ①socket()函數(shù) ②bind()函數(shù) ③listen()函數(shù) ④accept()函數(shù) ⑤客戶端

    2024年02月11日
    瀏覽(34)
  • TCP/IP(十一)TCP的連接管理(八)socket網(wǎng)絡(luò)編程

    TCP/IP(十一)TCP的連接管理(八)socket網(wǎng)絡(luò)編程

    一? socket網(wǎng)絡(luò)編程 ?socket 基本操作函數(shù) bind、listen、connect、accept、recv、send、select、close ①??針對 TCP 應該如何 Socket 編程? ②? ?listen 時候參數(shù) backlog 的意義? ③??accept 發(fā)生在三次握手的哪一步? ④? ?客戶端調(diào)用 close 了,連接是斷開的流程是什么? ⑤??沒有 accept,能建立 T

    2024年02月07日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包