實際上就是socket套接字編程。socket是一套網絡編程接口,類似于中間商一樣,上層用戶可以通過這些接口簡單完成網絡通信傳輸,不關心內部實現。
由于傳輸層有兩個主要的協議:TCP/UDP,這兩個協議各不相同,因此實現流程也不同,所以socket編程就分為兩種。
協議 | 協議特性 | 應用場景 |
---|---|---|
UDP | 無連接,不可靠,面向數據報 | 數據實時性大于安全性 |
TCP | 面向連接,可靠傳輸,面向字節流 | 數據安全性大于實時性 |
TCP/UDP講解
socket不能決定用戶使用哪種協議,只是提供一些接口,讓用戶填充關鍵信息。
網絡通信實際上就是兩端主機上進程之間的通信:(客戶端、服務器端)
客戶端:主動發出請求的一方主機。
服務器端:被動接受請求的一方主機。
永遠都是客戶端先發出請求
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);
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态