今天介紹的是基於ipv4的socket網路程式設計,我們知道socket api是一層的抽象的網路程式設計介面,但各網路協議的位址卻是各不相同的。
下圖是sockaddr資料結構圖:
ipv4和ipv6的位址格式定義在netinet/in.h中,ipv4位址用sockaddr_in結構體表示,包括16位的埠號和32位的ip位址,ipv6位址用sockaddr_in6表示,包括16位的埠號和128位的ip位址和一些控制字段。unix domain socket的位址格式定義在sys/un.h中,⽤用sockaddr_un結構體表 ⽰示。
ipv4、ipv6和unix domain socket的地 址型別分別定義為常數af_inet、af_inet6、af_unix。所以,我們根據結構體首位址型別欄位就可以確定結構體中的內容。
sockaddr_in在/usr/include/usr/include/linux/in.h裡面
socket api是一套通用的介面,可以接受各種型別的sockaddr結構體指標,但是引數需為void*型別的,由於socket api早於ansic所以那時沒有void*型別,所以我們要將函式引數轉為struct sockaddr *型別。
tcp連線所用到的一些函式
1、socket函式
作用 :socket函式是一種可用於根據指定的位址族、資料型別和協議來分配乙個套介面的描述字及其所用的資源的函式
引數:
domain: 乙個位址描述。目前僅支援af_***x格式:af_inet代表ipv4位址
type: 新套接字的型別描述:sock_stream : 提供面向連線的穩定資料傳輸,即tcp協議。 sock_dgram:表示面向資料報的傳輸協議,即udp協議
protocol : 套接字所用的協議。如呼叫者不想指定,可用0指定,表示預設。
返回值:成功返回檔案描述符,失敗返回-1
函式作用:宣告sockfd所處的狀態為監聽狀態,將套接字位址與所建立字型大小聯絡起來
引數:
af: 通訊發生的區域
type: 要建立的套接字型別
procotol: 使用的特定協議
3、accept和connect
這兩個是為了完成連線,引數和上面的相同。accept是伺服器端,connect是客戶端
功能:面向連線伺服器,表明它願意接收連線
返回值:成功返回0,失敗返回-1
**展示:
tcp_server.c:
tcp_client.c:#include
#include
#include
#include
#include
#include
#include
#include
#include
static usage(const
char* proc)
int startup(const
char* ip,int port)
printf("sock:%d\n",sock);
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(port);
local.sin_addr.s_addr = inet_addr(ip);
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0) //進行繫結
if(listen(sock,10) < 0) //將資源設定為監聽狀態
return sock;
}int main(int argc,char* argv)
int listen_sock = startup(argv[1],atoi(argv[2]));//上面返回的是listen的sockt
while(1)
//printf("get a new client [%s:%d]\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
printf("get a new client\n");
//客戶端和伺服器未能建立連線 繼續監聽
//先read後write
while(1)
else
if(s == 0 )
else}}
return
0;}
#include
#include
#include
#include
#include
#include
#include
#include
static
void usage(const
char* proc)
int main(int argc,const
char* argv)
int sock = socket(af_inet,sock_stream,0);
if(sock < 0)
struct sockaddr_in server;
server.sin_family = af_inet;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0)
//客戶端不需要繫結 也不需要監聽
//客戶端是先write後read
上面只是做了乙個本地的測試,在同一區域網的兩台主機也是可以進行通訊的。
socket程式設計之單程序socket server
套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件 一台機器上的程序可以使用套接字與另一台機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用套...
Socket網路程式設計之TCP
如果要用一句話總結tcp是什麼,我想應該是 tcp是網際網路運輸層的面向連線的 可靠的 基於位元組流的 全雙工的運輸協議 tcp運輸層協議服務 在分析tcp服務之前需要說明tcp在網路協議分層中處於哪個層次,下圖是tcp ip協議族的四個層次 tcp和udp都使用相同的網路層 ip 但是tcp向應用...
PHP多程序協作程式設計之 socket
基本思路 通過socket請求其他php腳步,實現php的多程序的非同步執行。廢話就不多說了,請看下面的腳步並執行之。a.php function runthread function a function b if isset get act get act a if get act a else...