Linux Socket程式設計 C

2021-08-25 15:03:43 字數 3367 閱讀 4286

最近看了一些網路程式設計的書籍,一直以來總感覺網路程式設計神秘莫測,其實網路程式設計入門還是很容易學的,下面這些**是我在linux下編寫的,已經執行過了,編譯之後就可以執行了。有不足之處希望大家多多指出,共同學習交流。

套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一台機器上的程序可以使用套接字與另一台機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用套接字通訊。套接字是一種通訊機制,客戶/伺服器系統既可以在本地單機上執行,也可以在網路中執行。套接字與管道的區別:它明確區分客戶與伺服器,可以實現將多個客戶連線到乙個伺服器。

套接字的工作過程(伺服器端):首先,伺服器應用程式通過socket系統呼叫建立乙個套接字,它是系統分配給該伺服器程序的類似檔案描述符的資源,不能與其他程序共享。其次,伺服器程序使用bind系統呼叫給套接字命名。本地套接字的名字是linux檔案系統的檔名,一般放在/tmp或者/usr/tmp 目錄下。網路套接字的名字是與客戶相連線的特定網路有關的服務識別符號。此識別符號允許linux將進入的針對特定埠號的連線轉到正確的伺服器程序。接下來,伺服器程序開始等待客戶連線到這個命名套接字,呼叫listen建立乙個等待佇列以便存放來自客戶的進入連線。最後,伺服器通過accept系統呼叫來接受客戶的連線。此時,會產生乙個與原有的命名套接字不同的新套接字,它僅用於與這個特定的客戶通訊,而命名套接字則被保留下來繼續處理來自其他客戶的連線。

套接字的工作過程(客戶端):呼叫socket建立乙個未命名套接字,將伺服器的命名套接字作為乙個位址來呼叫connect與伺服器建立連線。一旦建立了連線,就可以像使用底層檔案描述符那樣來用套接字進行雙向的資料通訊。

tcp協議:

伺服器端:tcp_server.c

#include #include #include #include #include int main(int argc, char *argv) /*將套接字繫結到伺服器的網路位址上*/ if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0) /*監聽連線請求--監聽佇列長度為5*/ listen(server_sockfd,5); sin_size=sizeof(struct sockaddr_in); /*等待客戶端連線請求到達*/ if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0) printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr)); len=send(client_sockfd,"welcome to my server/n",21,0);//傳送歡迎資訊 /*接收客戶端的資料並將其傳送給客戶端--recv返回接收到的位元組數,send返回傳送的位元組數*/ while((len=recv(client_sockfd,buf,bufsiz,0))>0)) } close(client_sockfd); close(server_sockfd); return 0; }

tcp協議:

客戶端:tcp_client.c

#include #include #include #include #include int main(int argc, char *argv) /*將套接字繫結到伺服器的網路位址上*/ if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0) printf("connected to server/n"); len=recv(client_sockfd,buf,bufsiz,0);//接收伺服器端資訊 buf[len]='/0'; printf("%s",buf); //列印伺服器端資訊 /*迴圈的傳送接收資訊並列印接收資訊--recv返回接收到的位元組數,send返回傳送的位元組數*/ while(1) close(client_sockfd);//關閉套接字 return 0; }

udp協議:

伺服器端:udp_server.c

#include #include #include #include #include int main(int argc, char *argv) /*將套接字繫結到伺服器的網路位址上*/ if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0) sin_size=sizeof(struct sockaddr_in); printf("waiting for a packet.../n"); /*接收客戶端的資料並將其傳送給客戶端--recvfrom是無連線的*/ if((len=recvfrom(server_sockfd,buf,bufsiz,0,(struct sockaddr *)&remote_addr,&sin_size))<0) printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr)); buf[len]='/0'; printf("contents: %s/n",buf); close(server_sockfd); return 0; }

客戶端:udp_client.c

#include #include #include #include #include int main(int argc, char *argv) strcpy(buf,"this is a test message"); printf("sending: '%s'/n",buf); sin_size=sizeof(struct sockaddr_in); /*向伺服器傳送資料報*/ if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0) close(client_sockfd); return 0; }

socket函式api.cpp

htons();//將short型別的值從主機位元組序轉換為網路位元組序

inet_addr();//將ip位址字串轉換為long型別的網路位元組序

gethostbyname();//獲得與該網域名稱對應的ip位址

inet_ntoa();//將long型別的網路位元組序轉換成ip位址字串

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...