udp bind,網絡編程:套接字socket函數與綁定信息bind函數

 2023-11-19 阅读 53 评论 0

摘要:套接字socket函數與綁定信息bind函數套接字綁定信息(綁定IP和端口)socket函數bind函數struct sockaddr結構體的組成:struct sockaddr_in結構體的組成:總結:編寫socket函數與bind函數 套接字 套接字是網絡編程中的一種通信機制,是支

套接字socket函數與綁定信息bind函數

  • 套接字
  • 綁定信息(綁定IP和端口)
  • socket函數
  • bind函數
  • struct sockaddr結構體的組成:
  • struct sockaddr_in結構體的組成:
    • 總結:
  • 編寫socket函數與bind函數

套接字

  • 套接字是網絡編程中的一種通信機制,是支持TCP/IP的網絡通信的基本操作單元,可以看做是不同主機之間的進程進行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關函數來完成通信過程。

進程間通信的方式:
1、管道(包括無名管道和命名管道);
2、消息隊列;
3、信號量;
4、共享存儲。
5、……( Socket和Streams支持不同主機上的兩個進程IPC)。

綁定信息(綁定IP和端口)

  • 所謂綁定(bind)是指別人連接我只能通過我所綁定的端口,相當于,我買了一個手機,別人要想聯系我,必須要知道我的手機號碼,這時候,我需要怎么辦呢?我需要給手機插上電話卡,固定一個電話號碼,這樣別人就能通過這個電話號碼聯系我。手機插上電話卡,固定一個電話號碼,類似于綁定(bind)的過程,綁定(bind)為了固定一個端口號,別的網絡程序就可以通過IP找到這個端口號,找到這個端口號就能找到這個端口號所對應的網絡應用程序。

socket函數

int socket(int domain,int type,int protocol) ;
  • udp bind?domain :地址域 指定網絡層到底使用什么協議
    AF_INET : ipv4版本的ip協議
    AF_INET6 : ipv6版本的ip協議

  • type :套接字類型
    SOCK_DGRAM :用戶數據報套接字
    SOCK_STREAM :流式套接字

  • protocol:協議
    SOCK_DGRAM :
    1.指定為0,表示采用默認協議,SOCK_DGRAM默認協議就是UDP協議
    2.IPPROTO_UDP ( 17)scoK_STREAM:
    1.指定為0,表示采用默認協議,
    SOCK_STREAM:
    1.指定為0,表示采用默認協議,默認協議是TCP協議
    2.IPPROTO_TCP (6)

  • 返回值: 返回一個套接字操作句柄,本質上是一個文件描述符,返回值大于等于o 則為創建成功,返回值小于0,則為創建失敗

bind函數

int bind(int sockfd,const struct sockaddr *addr , socklen_t addr1en);
  • sockfd :套接字描述符(socket函數的返回值)
  • addr :告訴操作系統內核,當前進程要綁定的地址信息是啥
  • addrlen :綁定的地址信息長度是多少

struct sockaddr結構體的組成:

struct sockaddr{
sa_family_t sa_family;//地址域,(AF_INET,AF_INT6)2字節char
sa_data[14];//14字節
}
  • sockaddr在頭文件#include <sys/socket.h>中定義,sockaddr的缺陷是:sa_data把目標地址和端口信息混在一起了
  • 注意:
    1.struct sockaddr這個結構體是一個通用的地址信息結構,并不是某一個具體的地址信息結構

struct sockaddr_in結構體的組成:

sslsocket套接字。在這里插入圖片描述

  • sockaddr_in在頭文件#include<netinet/in.h>或#include<arpa/inet.h>中定義,該結構體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變量中

總結:

在網絡編程中我們會對sockaddr_in結構體進行操作,使用sockaddr_in來建立所需的信息,最后使用類型轉化就可以了。一般先把sockaddr_in變量賦值后,強制類型轉換后傳入用sockaddr做參數的函數:sockaddr_in用于socket定義和賦值;sockaddr用于函數參數。

編寫socket函數與bind函數

#inclue<stdio.h>
#include<unistd.h>
//網絡編程
#include<sys/socket.h>
#include<netinet/in.h>//互聯網地址簇
#include<arpa/inet.h> //信息轉化int main() {//1.創建套接字int sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(sockfd<0) {perror("socket false");return -1;}//2.綁定地址struct sockaddr_in addr;addr.sin_family=AF_INET;//將ip地址轉化為無符號32位//將unit32轉化為主機字節序轉化為網絡字節序//htonl只能完成第二件事情//將字符串轉化為網絡字節序addr.sin_addr.s_addr=inet_addr("192.168.21.128");//端口轉換為網絡字節序addr.sin_port=htons(19999);//綁定地址信息int ret=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));if(ret<0) {perror("bind false");return -1;}while(1) {sleep(1);}return 0;
}

運行結果:sockfd的文件描述符為3,且為一個軟連接,閃爍表示源文件不存在,我們之前在管道中也遇見過,因為是直接進入內核內部的緩沖區進操作的,緩沖區并沒有文件:
在這里插入圖片描述
netstat -anp| grep 【端口號】查看綁定端口的相應信息:
在這里插入圖片描述

  • udp:當前19999端口是udp所占用
  • 192.168.21.128:19999:當前服務端監聽的ip和端口
  • 0.0.0.0:* :表示能接收任意ip和任意地址
  • 3760:進程號
  • ./test_socket:進程信息
  • 當前19999端口已經被3760進程所占用

注意
1.一個進程可以綁定多個端口,但一個端口只能綁定一個進程
2.如果客戶端想綁定端口號,一定要調用發送信息函數之前綁定( bind )端口,因為在發送信息函數( sendto, 或 write ),系統會自動給當前網絡程序分配一個隨機端口號,這相當于隨機綁定了一個端口號,這里只會分配一次,以后通信就以這個隨機端口通信,我們再綁定端口號的話,就會綁定失敗。如果我們放在發送信息函數( sendto, 或 write )之前綁定,那樣程序將以我們綁定的端口號發送信息,不會再隨機分配一個端口號。

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

原文链接:https://808629.com/181406.html

发表评论:

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

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息