(一)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 客戶端作業系統收到資料後...