socket網絡編程基礎,Linux---網絡編程基礎

 2023-10-15 阅读 25 评论 0

摘要:網絡編程 實際上就是socket套接字編程。socket是一套網絡編程接口,類似于中間商一樣,上層用戶可以通過這些接口簡單完成網絡通信傳輸,不關心內部實現。 socket編程分類 由于傳輸層有兩個主要的協議:TCP/UDP,這兩個協議各不相同,因此

網絡編程

實際上就是socket套接字編程。socket是一套網絡編程接口,類似于中間商一樣,上層用戶可以通過這些接口簡單完成網絡通信傳輸,不關心內部實現。

socket編程分類

由于傳輸層有兩個主要的協議:TCP/UDP,這兩個協議各不相同,因此實現流程也不同,所以socket編程就分為兩種。

  • TCP
  • UDP
協議協議特性應用場景
UDP無連接,不可靠,面向數據報數據實時性大于安全性
TCP面向連接,可靠傳輸,面向字節流數據安全性大于實時性

TCP/UDP講解

socket不能決定用戶使用哪種協議,只是提供一些接口,讓用戶填充關鍵信息。

網絡通信實際上就是兩端主機上進程之間的通信:(客戶端、服務器端)
客戶端:主動發出請求的一方主機。
服務器端:被動接受請求的一方主機。
永遠都是客戶端先發出請求

socket網絡編程基礎。當客戶端想和服務器端建立傳輸,就需要服務器端在客戶端傳輸之前,等待客戶端的傳輸。

服務器端流程

  1. 創建套接字:在內核中創建套接字結構體,向進程返回一個操作句柄,通過這個內核中的socket結構體和網卡建立聯系。
  2. 為套接字綁定地址信息:為內核中創建的socket結構體中添加各種地址描述信息。(IP地址,端口信息)==綁定地址信息,只能綁定自己主機的IP地址。
  3. 接收數據:從socket緩沖區中取出數據,每個數據都包含源地址與目的地址,從而獲取源地址。(網卡接收到數據后,如果數據有進程使用,則將該數據放入socket緩沖區中)
  4. 發送數據:把數據放到內核socket結構體內核緩沖區中,操作系統在合適的時間,會從發送緩沖區中取出數據,將數據層層封裝,最終通過網卡發出去。
  5. 關閉套接字,釋放資源。

客戶端流程

  1. 創建套接字。
  2. 為套接字綁定地址信息。
  3. 發送數據。
  4. 接收數據。
  5. 關閉套接字,釋放資源。

客戶端永遠都是主動發送的一方,因此客戶端必須知道服務端的地址信息才能發送數據,發送數據之間先要對數據進行層層封裝。

socket接口

#include<sys/socket.h>

  • 創建套接字
    int socket(int domain , int type ,int protocol
    domain:地址域,不同的網絡地址結構,AF_INET:IPv4地址域,AF_INET6:IPv6地址協議。
    type:套接字類型:流式套接字、數據報套接字
    流式套接字: 有序的,可靠的,雙向的,基于連接的 SOCK_STREAM。
    數據報套接字:無序的,不可靠,有最大長度限制的 SOCK_DGRAM。
    protocol協議:0表示不同套接字下的默認協議。
    IPPROTO_TCP:tcp協議
    IPPROTO_UDP:udp協議
    返回值:返回套接字的操作句柄,文件描述符。

  • 網絡編程基本步驟,為套接字綁定地址信息。
    int bind(int sockfd,struct sockaddr *addr,socklen_t len)
    socked:創建套接字返回的操作句柄。
    addr:要綁定的地址信息結構。
    len:地址信息的長度。
    返回值:成功返回0,失敗返回-1

  • 發送數據
    int sendto(int sockfd,char *data,int data_len,int flag,struct sockaddr *dest_addr,socklen_t addr_len)
    sockfd:套接字操作句柄,發送數據就是將數據拷貝到內核的socket發送緩沖區中。
    data:要發送的數據首地址
    data_len:要發送數據的長度
    flag:選項參數,默認為0表示阻塞操作 MSG_DONTWAIT:設置為非阻塞。若發送數據的時候,緩沖區已經滿了,則0默認等待,MSG_DONTWAIT直接報錯返回。
    dest_addr:對端地址信息結構,表示數據發送給誰。每一條數據都要描述源端信息(綁定地址信息)和對端信息(當前賦予的信息)
    adde_len:地址信息長度
    返回值:成功返回實際發送的數據長度,失敗返回-1。

  • 接收數據
    int recvfrom(int sockfd, char *buf, int len,int flag,struct sockaddr *src_addr,socklen_t *addr_len
    buf:緩沖區的首地址,由于存放接收的數據,從內核socked的接收緩沖區中取出數據放入buf中。
    len:用戶想要讀取的信息長度,不能大于buf
    flag:0默認阻塞等待,MSG_DONTWAIT:非阻塞操作
    src_addr:接收到的源端地址,回復的時候使用(發送端地址)
    addr_len:輸入輸出參數,用于指定想要獲取的地址信息,獲取信息后,用于返回地址信息結構的實際長度
    返回值:成功返回實接收的數據長度,失敗返回-1

  • 關閉套接字:
    int close(int fd);

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/140483.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息