socket程式設計之TCP單程序的伺服器

2021-08-03 07:25:19 字數 3633 閱讀 5019

今天介紹的是基於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:

#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;}

tcp_client.c:

#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...