linux網路程式設計 TCP socket程式設計模型

2021-09-10 12:18:04 字數 4528 閱讀 8069

1. 程式設計模型

三次握手 + 四次揮手

2.主要函式說明

位元組序轉換函式:

#include uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

ip轉換函式:

#include int inet_pton(int af, const char *src, void *dst);//把字串的ip轉換成32位二進位制的整型

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//把32位二進位制的整型轉成字串的ip

sockaddr結構體:

struct sockaddr ;

//ipv4

struct sockaddr_in ;

/* internet address. */

struct in_addr ;

//ipv6

struct sockaddr_in6 ;

struct in6_addr in6_u;

#define s6_addr in6_u.u6_addr8

#define s6_addr16 in6_u.u6_addr16

#define s6_addr32 in6_u.u6_addr32

};#define unix_path_max 108

struct sockaddr_un ;

socket():

#include /* see notes */

#include int socket(int domain, int type, int protocol);

domain:

af_inet 這是大多數用來產生socket的協議,使用tcp或udp來傳輸,用ipv4的位址

af_inet6 與上面類似,不過是來用ipv6的位址

af_unix 本地協議,使用在unix和linux系統上,一般都是當客戶端和伺服器在同一臺及其上的時候使用

type:

sock_stream 這個協議是按照順序的、可靠的、資料完整的基於位元組流的連線。這是乙個使用最多的socket型別,這個socket是使用tcp來進行傳輸。

sock_dgram 這個協議是無連線的、固定長度的傳輸呼叫。該協議是不可靠的,使用udp來進行它的連線。

sock_seqpacket 這個協議是雙線路的、可靠的連線,傳送固定長度的資料報進行傳輸。必須把這個包完整的接受才能進行讀取

sock_raw 這個socket型別提供單一的網路訪問,這個socket型別使用icmp公共協議。(ping、traceroute使用該協議)

sock_rdm 這個型別是很少使用的,在大部分的作業系統上沒有實現,它是提供給資料鏈路層使用,不保證數包的順序

protocol:

0 預設協議

返回值:

成功返回乙個新的檔案描述符,失敗返回-1,設定errno

bind():

#include /* see notes */

#include int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

//繫結後,若有使用者訪問addr位址時,會通過sockfd進行資料傳遞

sockfd:

socket檔案描述符

addr:

構造出ip位址加埠號

addrlen:

sizeof(addr)長度

返回值:

成功返回0,失敗返回-1, 設定errno

listen():

#include /* see notes */

#include int listen(int sockfd, int backlog);//讓sockfd所指向的socktet具有監聽的能力

sockfd:

socket檔案描述符

backlog:

排隊建立3次握手佇列和剛剛建立3次握手佇列的鏈結數和(預設為128 )

accept():

#include /* see notes */

#include int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockdf:

socket檔案描述符

addr:

addrlen:

傳入傳出引數(值-結果),傳入sizeof(addr)大小,函式返回時返回真正接收到位址結構體的大小(ipv4或ipv6)

返回值:

成功返回乙個新的socket檔案描述符,用於和客戶端通訊,失敗返回-1,設定errno

connect():

#include /* see notes */

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

sockdf:

socket檔案描述符

addr:

傳入引數,指定伺服器端位址資訊,含ip位址和埠號

addrlen:

傳入引數,傳入sizeof(addr)大小

返回值:

成功返回0,失敗返回-1,設定errno

3. 示例**

server.c

#include #include #include #include #include #include #include #define server_port 8000

#define maxline 4096

int main(void)

write(confd, buf, len);

close(confd);

}close(sockfd);

return 0;

}

client.c

#include #include #include #include #include #include #include #include #include #include #define server_port 8000

#define maxline 4096

int main(int argc, char *ar**)

//1.建立乙個socket

confd = socket(af_inet, sock_stream, 0);

//2.初始化伺服器位址

bzero(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = af_inet;

//"192.168.6.254"

inet_pton(af_inet, ipstr, &serveraddr.sin_addr.s_addr);

serveraddr.sin_port = htons(server_port);

//3.鏈結伺服器

connect(confd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

//4.請求伺服器處理資料

write(confd, ar**[1], strlen(ar**[1]));

len = read(confd, buf, sizeof(buf));

write(stdout_fileno, buf, len);

//5.關閉socket

Linux網路程式設計

linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...

linux 網路程式設計

當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...

linux 網路程式設計

套接字程式設計 struct sockaddr unsigned short sa family 位址協議,ipv4 tcp ip af inet,ipv6 af inet6 char sa data 14 14位元組的位址協議 struct sockaddr in unsigned short s...