第1章 網路程式設計基礎 2 Socket程式設計原理

2022-08-27 03:15:07 字數 4585 閱讀 7222

socket是網路通訊端點的一種抽象,它提供了一種傳送和接收資料的機制。

面向連線的操作比無連線的操作效率低,但資料的安全性更高。

socket通訊流程

ip位址標誌主機,埠號標誌程序,ip加上埠號才能確定連線目標。

乙個網路連線需要以下5種資訊:

本地協議埠:指出接收報文或資料的程序。

遠端協議埠:指出目的程序或成。

協議:指出程式在網路上傳輸資料時使用的協議。

1.socket:用於建立乙個socket套接字。

socket socket(

int af, //

使用的協議族

int type, //

socket型別

int protocol //

使用的協議位址

);

socket協議族在計算機裡表示為乙個整數,可以取值af_inet

socket型別有兩種:sock_stream和sock_dgram代表流socket和資料報socket

函式如果成功,返回乙個socket描述字,否則,返回invalid_socket。

socket s = socket(af_inet,sock_stream,0);

2.connect:用於嘗試與遠端建立乙個socket連線。

int

connect(

socket s,

//socket描述符

const

struct sockaddr* name,    //

遠端的位址

int namelen //

遠端位址的長度

);

遠端位址是乙個sockaddr的結構

struct

sockaddr_in(

short sin_family, //

socket族

u_short sin_port, //

埠struct in_addr sin_addr, //

ip位址

char sin_zero[8] //

結構長度

);

函式如果連線成功,返回0,否則返回socket_error.對於非阻塞模式的socket連線,返回結果通常是socket_error,並且錯誤**為wsaewouldblock,表示連線正在進行,而不是乙個真正的錯誤。

建立連線通常是客戶端發出連線請求:

socket s;

sockaddr_in serveraddr;

serveraddr.sin_family=af_inet;

serveraddr.sin_port=htons(port);

serveraddr.sin_addr.s_addr=inte_addr("

127.0.0.1");

connect(s,(sockaddr*)&serveraddr,sizeof(serveraddr));

3.send:用於在某個socket上向遠端傳送資料

int

send(

socket s,         

//socket套接字

const

char* buf,     //

存放傳送資料的緩衝區

int len,         //

將要傳送的資料長度

int flags         //

傳送時使用的附加引數

);

如果傳送成功,返回值為成功傳送的位元組數,否則返回socket_error。

4.recv:與傳送資料相對應的就是接收資料,函式recv用於接收端傳送的資料,函式原型為:

int

recv(

socket s,

//socket套接字

char* buf, //

存放接收資料的緩衝區

int len, //

將要接收的資料長度

int flags //接收

時使用的附加引數

);

接收資料成功,函式返回接收的位元組數,否則,返回socket_error。

5.closesocket:用於關閉不再需要的socket

int

closesocket(

socket s;        

//socket套接字

);

關閉成功,返回0,否則返回socket_error。

6.listen:用於在某個socket上建立監聽

int

listen(

socket s,

//socket套接字

int backlog //

快取佇列的長度

);

如果建立監聽成功,返回0;否則返回socket_reeor

backlog引數。設為somaxconn,表示取系統連線的最大值。

7.accept:用於接收一條新的連線。

socket accept(

socket s,

//監聽中的socket

struct sockaddr* addr ,//

表示位址結構體的指標

int* addrlen//

位址結構體的長度

);

函式執行成功,返回0;否則,返回socket_error.

8.bind:用於給乙個socket套接字分配乙個本地協議位址

int

bind(

socket s,

//socket套接字

const

struct socketaddr* name,//

表示位址結構體的指標

int namelen//

位址結構體的長度

);

函式執行成功,返回0;否則,返回socket_error.

9.select:用於檢測socket狀態,主要用於高階的網路通訊模型

int

select

(int nfds,//

winsocj中此引數無意義

fd_set* readfds,//

進行可讀檢測的socket

fd_set* writefds,//

進行可寫檢測的socket

fd_set* exceptfds,//

進行異常檢測的socket

const

struct timeval* timeout//

非阻塞模式中設定最大等待時間

);

函式執行成功,返回0;否則,返回socket_error.

ascii位址->整數字址

#include int inet_aton(const

char* straddr,struct in_addr* adrp);

返回:0表示轉換不成功;1表示轉換成功。

整數字址->ascii位址

#include char *inet_ntoa(struct in_addr inaddr);

返回:null程式設計轉換不成功;其他返回值表示轉換成功。

網域名稱位址->整數字址

#include struct hostent *gethostname(const

char *name);

整數字址->網域名稱位址

#include struct hostent *gethostbyaddr(const

char *addr,int len,int family);

儲存位元組的格式:

函式命名規律:

h代表位元組順序(本機順序),n代表網路順序(network)

//

本地位元組轉化為網路位元組順序(長整數)

u_long pascal far htonl(in u_long hostlong);

//本地位元組轉化為網路位元組順序(短整數)

u_short pascal far htons(in u_short hostshort);

//網路位元組轉化為本地位元組順序(長整數)

u_long pascal far ntohl(in u_long netlong);

//網路位元組轉化為本地位元組順序(短整數)

u_short pascal far ntohs(in u_short netshort);

第16章 網路程式設計 2

16.3 python中的網路程式設計 16.3.1 socket 模組函式 使用socket.socket 函式來建立套接字。socket socket family,socket type,protocol 0 import socket tcpsock socket.socket socket...

unix網路程式設計第2版 卷1 第6章 同步

6.1概述 在5.12節中,我們看到tcp客戶同時處理兩個輸入 標準輸入和tcp套介面。我們遇到的問題是客戶阻塞於 標準輸入上的 fgets呼叫,而伺服器程序又被殺死。伺服器tcp雖正確地給客戶tcp發了乙個fin,但客戶程序正阻塞於從標準輸入讀入,它直到從套介面讀時才能看到此檔案結束符 可能已經過...

MOOC清華《程式設計基礎》第1章第2題 求周長

題目描述 mooc清華 程式設計基礎 第1章第2題 求周長,已知乙個圓的半徑是2,請編寫程式計算輸出它的周長。要求計算中以3.14159作為圓周率的值。保留小數點後5位 輸入描述 無輸出描述 輸出圓形周長 附加說明 保留小數點的功能需要包含iomanip標頭檔案,並在輸出數字前加上 例如 cout ...