套接字(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程式設計基...