socket程式設計 UDP TCP

2021-10-10 07:10:27 字數 3972 閱讀 4327

1.socket簡介

socket,又叫套接字,是一種軟體形式的抽象,用於表達兩台機器間乙個連線的「終端」。服務端的socket在服務端機器上特定的埠進行等待,客戶端的socket繫結了服務端的ip位址以及它正在監聽著的埠,所以兩者通過ip和埠連線起來,就如同一條虛擬的通道。sockets(套接字)程式設計有三種,流式套接字(sock_stream),資料報套接字(sock_dgram),原始套接字(sock_raw);基於tcp的socket程式設計是採用的流式套接字。 函式

備註通用位址結構

struct  sockaddr{

uint8_t sa_len;

sa_family_t sa_family;

char sa_data[14];

由於套接字函式需接收來自不同協議的位址結構,ansi的辦法是使用通用的指標型別,即(void *)。套接字函式方法是定義乙個通用的套接字位址結構。

這就要求呼叫套接字函式時,需將指向特定於協議的位址結構的指標型別轉換成指向通用的位址結構的指標。

ipv4

typedef  uint32_t  in_addr_t;

typedef  uint16_t  in_port_t;

typedef  unsigned short  sa_family_t;

struct  in_addr{

in_addr_t  s_addr;

struct  sockaddr_in {

uint8_t sin_len;

sa_family_t sin_family;

in_port_t sin_port;

struct in_addr sin_addr;

char sin_zero[8];

ipv6

typedef  uint16_t  in_port_t;

typedef  unsigned short  sa_family_t;

struct  in6_addr{

uint8_t      s6_addr[16];

struct  sockaddr_in6{

uint8_t       sin6_len;

sa_family_t   sin6_family;

in_port_t     sin6_port;

uint32_t      sin6_flowinfo;

struct  in6_addr  sin6_addr;

序號函式名介紹1

socket函式

#include

int socket(int family, int type, int protocol)

返回:非負套接字(sockfd)為成功;-1為出錯。family:通訊域;type:套接字型別;

protocol:指明此socket請求所使用的協議,一般採用預設的0,表示按給定的域和套接字型別選擇預設協議。也可以使用如下相關符號常數來表示:ipproto_tcp:表示tcp協議,ipproto_udp:表示udp協議。

2bind函式

#include

int bind(int sockfd, const struct sockaddr *addr, socklen_len len)

返回:0為成功;-1為出錯並置errno

len是該位址結構(第二個引數)的長度。

一般而言,伺服器呼叫此函式,而客戶則很少呼叫它。

3listen函式

#include

int listen(int sockfd, int backlog)

返回:0為成功;-1為出錯並置errno

函式listen僅被伺服器呼叫,它完成兩件事情:

(1)函式listen將未連線的套接字轉化成被動套接字,指示核心應接受指向此套接字的連線請求;

(2)函式的第二個引數規定了核心為此套接字排隊的最大連線個數,但與系統所允許的最大連線數沒有關係。

對於給定的監聽套接字,核心要維護兩個佇列,即未完成連線佇列和已完成連線佇列,但還沒有被應用程式所接受,兩個佇列之和不超過backlog;

4connect函式

#include

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

返回:0為成功;-1為出錯

5accept函式

#include

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);

返回:非負描述字(connfd)為ok;-1為出錯;

accept函式由tcp伺服器呼叫;從已完成連線佇列頭返回下乙個已完成連線;如果該佇列空,則程序進入睡眠狀態。

函式返回的套接字為已連線套接字,應與監聽套接字區分開來。

該函式最多返回三個值:乙個既可能是新套接字也可能是錯誤指示的整數,乙個客戶程序的協議位址(由cliaddr所指),以及該位址的大小;也就是說,伺服器可以通過引數cliaddr來得到請求連線並獲得成功的客戶的位址和埠號

6close函式

#include

int close(int sockfd);

返回:0為成功;-1為出錯

7read和write函式

#include

int read(int fd, char *buf, int bufflen);

int write(int fd, char *buf, int len);

返回:大於0為位元組大小;-1為出錯;

8send函式(tcp)

#include

#include

ssize_t send (int fd, const void *msg, size_t len, int flags);

返回:非0為傳送成功的資料長度;-1為出錯;

flags 是傳輸控制標誌,其值定義如下:

0:常規操作,如同write()函式     

msg_oob,傳送帶外資料(tcp緊急資料)。

msg_dontroute:忽略底層協議的路由設定,只能將資料傳送給與傳送機處在同乙個網路中的機器上。

9recv函式(tcp)

#include

#include

ssize_t recv(int fd, void *buf ,size_t len, int flags);

返回:大於0表示成功接收的資料長度;0: 對方已關閉,-1:出錯。

flags是傳輸控制標誌,其值定義如下:

0:常規操作,如同read()函式;

msg_peek:只檢視資料而不讀出資料,後續讀操作仍然能讀出所檢視的該資料;

msg_oob:忽略常規資料,而唯讀帶外資料;

msg_waitall:等待直到所有的資料可用,僅sock_stream。此時len表示的是等待資料的長度,而不再是buf的長度

10sendto函式(udp)

#include

#include

int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen);

第乙個引數為socket描述符;第二個引數為資料快取位址;第三個引數為長度;第四個引數一般為0;第五個引數為對方位址;第六個引數為對方位址長度。

11recvfrom函式(udp)

#include

#include

int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

詳解和sendto函式類似。

**如下:

**測試如下:

參考:1.

2.

UDP TCP網路程式設計

建立udp網路程式流程 import socket 建立乙個udp的socket連線 udp socket socket.socket socket.af inet,socket.sock dgram 獲取使用者的輸入內容 data input 請輸入內容 準備接收方的位址和埠號 addr 127....

基於UDP TCP協議下的socket套接字

本篇文章我主要想用來介紹關於udp tcp協議的基本知識及兩個的優缺點 基於這兩種協議下的套接字的基本用法,以及最重要的個人理解。udp協議 是user datagram protocol即使用者資料報協議的一種簡稱,是osi參考模型中的一種無連線傳輸協議,其提供面向事物的不可靠資訊傳輸服務。在網路...

Java之網路程式設計 UDP TCP

網路模型七大模型 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層 應用層 ip位址 確定主機在網路中的位置 ipv4 四位0 255來組成 10.9.20.254 埠 用於和計算機外界進行資料互動的媒介 埠號 0 65535 埠號在 0 1024之間大部分都被系統提前占用了 最好以後指定埠號時盡...