Linux C程式設計

2022-03-29 00:31:14 字數 3453 閱讀 5310

套接字(sockets),即為網路程序id,是由執行這個程序的計算機的ip位址和這個程序使用的埠(port)組成.

可以只用'netstat-all' 檢視當前系統中網路應用程序的套接字和埠. 可以使用 > 輸出重定向到檔案.

linux在標頭檔案中定義了通用的套接字結構型別,可供不同協議呼叫

struct sockaddr

除了sockaddr之外,linux還在中定義了另外一種結構型別 sockaddr_in ,它和sockaddr等效且可以互相轉換.通常用於tcp/ip協議

struct sockaddr_in

對其中struct in_addr sin_addr說明如下

struct sin_addr

常見協議對應的sa_famliy值

可選值說明

af_inet

ipv4協議

af_inet6

ipv6協議

af_local

unix協議

af_link

鏈路位址協議

af_key

金鑰套接字

往往網路上的不同機器,資料儲存模式不同,小型機通常為小端模式,大型機為大端模式.所以往往需要位元組轉換.

linux 提供了htonl ,htons,ntohl ,ntohs函式處理大端和小端模式轉換

解釋:htonl/htons:host to network long/short;同理ntohl/ntohs:network to host long/short

#include unit32_t htonl(unit32_t hostlong);

unit16_t htons(unit16_t hostshort);

unit32_t ntohl(unit32_t netlong);

unit16_t ntohs(unit16_t netshort);

32為long資料通常存放ip位址,16為通常存放埠號

htonl:將32為pc機資料(小端)轉為32位網路傳輸資料(大端)

套接字與字串不同,套接字是多位元組資料而不是以空字串結尾.linux提供了若干函式,在記憶體上直接操作套接字

2.2.1

第一組函式是與bsd系統相容的函式,包括bzero,bcopy,bcmp.

bzero:將引數s指定的前n個位元組設定為0,通常用來對套接字位址清零

#include void bzero(void *s,size_t n);
bcopy:從引數src指定的記憶體區域,拷貝指定數目位元組內容到dest指定記憶體區域

#include void bcopy(const void* s1,void *dest,size_t n);
bcmp:用於比較是引數s1和引數s2指定記憶體區域的前n位元組.如果相同返回0,否則返回非0

#include int bcmp(const void *s1,const void *s2,size_t n);
2.2.2

ip位址通常是點分十進位制表示,linux網路程式設計中會使用32二進位制值.linux提供了若干函式保證二者相互轉換

實際網路程式設計中往往會遇到www.baidu.com這樣的網域名稱linux提供了函式讓網域名稱轉為ip位址和讓ip位址轉網域名稱

liunx使用socket函式建立套接字描述符

#include #include int socket(int domain,int type,int protocol);
函式呼叫成功,則返回套接字描述符(正整數),否則返回-1

引數說明

在建立套接字後需要將本地位址和套接字繫結,可以呼叫bind函式

#include #include int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
sockfd是建立套接字時對於的套接字描述符.addr是本地位址.addrlen是套接字對應的位址結構長度;

bind函式執行成功返回0,否則返回-1

bind函式繫結模式有5種:

...等待更新

使用socket函式建立套接字並繫結位址後,即可使用connect函式和伺服器建立連線

#include #include int connect(int sockfd,const struct sockaddr *addr,socken_t addrlen);
引數sockfd是套接字創立後函式socket返回的套接字描述符;

引數addr指定遠端伺服器的套接字位址,包括伺服器位址和埠號;

引數addrlen 指定套接字位址長度;

呼叫connect函式成功後,返回0,否則為-1

socket函式直接創立的是主動套接字,用來傳送請求的.如果是伺服器需要傾聽套接字,接受請求.使用listen函式將套接字轉換為傾聽套接字

#include #include int listen(int sockfd,int backlog);
引數sockfd使套接字描述符;backlog是請求佇列的最大長度

baclog的作用:

...待更新

當伺服器接收到乙個連線後,可以使用函式accept從傾聽套接字的完成連線佇列中接受乙個連線。如果完成連線隊列為空,則程序進入睡眠。

#include #include int accept(int sockfd,struct sockaddr *addr ,socklen_t *addrlen);
#include int close(int fd);
int read(int fd,char *buf,int len);

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

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

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

#include #include ssize_t send(int socketfd,const void *buf,size_t len,int flags);

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

待更新...

linux c 程式設計

linux下為了安全性不能雙擊執行控制台程式,只有gui程式才能雙擊執行.linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於...

linux c程式設計 網路程式設計

在網路上,通訊服務都是採用 c s機制,也就是客戶端 伺服器端工作流程 使用socket 函式建立伺服器端通訊套介面 使用bind 函式將建立的套介面與伺服器位址繫結 使用listen 函式使伺服器套介面做好接收連線請求準備 使用accept 接收來自客戶端由connect 函式發出的連線請求 根據...

linux C 程式設計環境

gcc 中文手冊 gnu make 指南 autoconf 2.57手冊 英文 autoconf 2.13手冊 使用 automake 使用cvs進行版本管理 cvs用後感 linux下常用除錯工具 非常好的gdb教程,強烈推薦 gdb英文文件 gdb基本用法 gdb的官方文件 linux程式設計基...