網路程式設計總結(C S)

2021-08-25 11:15:28 字數 3967 閱讀 1823

(一)tcp程式設計流程

伺服器端程式設計流程

/*第一步:建立socket int socket(int domain.int type,int protocol)

成功時返回乙個socket 失敗時返回-1並設定error

domain:告訴系統使用哪個底層協議族 pf_inet(ipv4) pf_inet6(ipv6)

type:指定服務型別 sock_stream(流服務) sock_ugram(資料報服務)

protocol:在前兩個協議的結合下,在選擇乙個具體的協議,預設值為0,表示使用預設協議

第二步:命名socket int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addrlen)

將socket與位址協議族中的某個socket位址繫結  成功時返回0,失敗返回-1並設定error

常見的error   1.eacces 被繫結的位址是受保護的位址,僅可以被超級使用者訪問;普通使用者繫結0-1023的埠號時會返回eacces錯誤

2.eaddrinuse 被繫結的位址正在被使用 比如將socket繫結到正處於time_wait狀態的位址上

第三步:監聽socket int listen(int sockfd,int backlog)

sockfd被指定要監聽的socket backlog表示核心監聽佇列的最大長度 

linux核心版本2.2之前是處於syn_recv和established的socket的上限

2.2版本之後表示處於established的socket的上限,

處於半連線狀態的socket上限由/proc/sys/net/ipv4/tacp_max_syn_backlog核心引數設定

超過此上限,伺服器將不再接受新的客戶端連線並返回econnrefused錯誤資訊

第四步:接受連線  int accept(int socket,struct sockaddr *addr,socklen_t *addrlen)

sockfd指的是經過listen系統呼叫的監聽socket  addr引數用來指定被接受連線的socket位址 addrlen為其長度

accept成功時返回乙個新的連線socket,該socket唯一標識了這個被接受的連線 失敗時返回-1並設定error

第五步:recv ssize_t recv(int sockfd,void* buf,siez_t len ,int flags)

返回實際讀取到的資料的長度

第六步:send  ssize_t send(int sockfd,const void* buf,size_t len,int flags)

返回實際寫入的資料的長度

第七步:close int close(int fd)

fd的等待關閉連線的socket close系統呼叫並不是立即關閉 而是將fd的引用計數為0時才真正關閉連線

多程序程式中,一次fork系統呼叫預設父程序開啟得socket的引用計數加1,所以要將父子程序中的socket都關閉才是真正斷開連線

如果想立即終止連線 可以使用下列的函式 

int shutdown(int fd,int howto)

howto決定了關閉的行為

shut_rd 關閉socket讀的一端 應用程式不能針對socket進行讀操作 並且該socket接受緩衝區中的資料都被丟棄

shut_wr 關閉socket寫的一端 在關閉之前將socket傳送緩衝區的資料全部傳送出去 應用程式不能針對socket進行寫操作 這種情況下 經常處於半關閉狀態

shut_rdwr 同時關閉socket上的讀與寫

*/客戶端程式設計流程

/*第一步:建立socket int socket(int domain.int type,int protocol)

成功時返回乙個socket 失敗時返回-1並設定error

domain:告訴系統使用哪個底層協議族 pf_inet(ipv4) pf_inet6(ipv6)

type:指定服務型別 sock_stream(流服務) sock_ugram(資料報服務)

protocol:在前兩個協議的結合下,在選擇乙個具體的協議,預設值為0,表示使用預設協議

第二步:命名socket int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addrlen)

將socket與位址協議族中的某個socket位址繫結  成功時返回0,失敗返回-1並設定error

常見的error   1.eacces 被繫結的位址是受保護的位址,僅可以被超級使用者訪問;普通使用者繫結0-1023的埠號時會返回eacces錯誤

2.eaddrinuse 被繫結的位址正在被使用 比如將socket繫結到正處於time_wait狀態的位址上

第三步:連線 int connect(int sockfd,const struct sockaddr* ser_addr,socklen_t addrlen)

sockfd是系統socket系統呼叫產生的socketfd ser_addr是伺服器監聽的socket位址 addrlen為此位址的長度

成功時返回0 一旦連線成功 sockfd就唯一標識了這個連線 

失敗時返回-1並設定error

econnrefused 目標埠不存在 連線被拒絕

etimedout 連線超時

與伺服器端相同

第四步:send

第五步:recv

第六步:close

*/以下為**示例

#include #include #include #include #include #include #include #include #include #include #include #include void main()

; //接受客戶端訊息

int n = recv(fds[i],buff,128,0);

if(n <= 0)

printf("buff::%s\n",buff);

//向客戶端發訊息

send(fds[i],"0k",2,0);

}}

#include #include #include #include #include #include #include #include #include void main()

; printf("please input:");

fgets(buff,128,stdin);

if(strncmp(buff,"end",3) == 0)

send(sock_fd,buff,strlen(buff) - 1,0);//不將 \n傳送給伺服器

memset(buff,0,128);

recv(sock_fd,buff,127,0);

printf("buff:: %s\n",buff);

} close(sock_fd);

}

1.轉換埠號

#include unsigned short int htons(unsigned short int hostshort);
2.轉換ip位址

#include int_addr_t inet_addr(const char *strptr)
(二)udp程式設計流程

伺服器端程式設計流程

建立socket(socket)------->命名socket(bind)------>recvfrom()----->sendto()------>close()

客戶端程式設計流程

建立socket(socket)------->命名socket(bind)------>連線伺服器connect()---->recvfrom()----->sendto()------>close()

linux udp網路程式設計 c s

1 server deepfuture deepfuture laptop private mytest testupds server wait.server read deepfuture.iteye.com server send hello server wait.cdeepfuture d...

網路程式設計 C S模型 UDP

目錄 一 udp模型 1 服務端 2 客戶端 二 測試程式 1 服務端 2 客戶端 沒有 accept,不需要建立建立連線 使用 recvfrom 代替 read,失敗返回 1,成功返回 從核心緩衝區讀到的位元組數 使用 sendto 代替 write,失敗返回 1,成功返回 寫到核心緩衝區的位元組...

網路程式設計 C S架構,TCP IP介紹

什麼是c s架構?c指的是client 客戶端軟體 s指的是server 服務端軟體 應用軟體如何執行?客戶端軟體想要基於網路傳送一條訊息給服務端軟體,流程是 1 客戶端軟體產生資料,存放於客戶端軟體的記憶體中,然後呼叫介面將自己記憶體中的資料傳送 拷貝給作業系統記憶體 2 客戶端作業系統收到資料後...