最近看了一些網路程式設計的書籍,一直以來總感覺網路程式設計神秘莫測,其實網路程式設計入門還是很容易學的,下面這些**是我在linux下編寫的,已經執行過了,編譯之後就可以執行了。有不足之處希望大家多多指出,共同學習交流。
套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一台機器上的程序可以使用套接字與另一台機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用套接字通訊。套接字是一種通訊機制,客戶/伺服器系統既可以在本地單機上執行,也可以在網路中執行。套接字與管道的區別:它明確區分客戶與伺服器,可以實現將多個客戶連線到乙個伺服器。
套接字的工作過程(伺服器端
):首先,伺服器應用程式通過socket系統呼叫建立乙個套接字,它是系統分配給該伺服器程序的類似檔案描述符的資源,不能與其他程序共享。其次,伺服器程序使用bind系統呼叫給套接字命名。
本地套接字的名字是linux檔案系統的檔名,一般放在/tmp或者/usr/tmp 目錄下。網路套接字的名字是與客戶相連線的特定網路有關的服務識別符號。此識別符號允許linux將進入的針對特定埠號的連線轉到正確的伺服器程序。
接下來,伺服器程序開始等待客戶連線到這個命名套接字,呼叫listen建立乙個等待佇列以便存放來自客戶的進入連線。最後,伺服器通過accept系統呼叫來接受客戶的連線。此時,會產生乙個與原有的命名套接字不同的新套接字,它僅用於與這個特定的客戶通訊,而命名套接字則被保留下來繼續處理來自其他客戶的連線。
套接字的工作過程
(客戶端):呼叫socket建立乙個未命名套接字,將伺服器的命名套接字作為乙個位址來呼叫connect與伺服器建立連線。一旦建立了連線,就可以像使用底層檔案描述符那樣來用套接字進行雙向的資料通訊。
tcp協議:
伺服器端:tcp_server.c
view plain
print?
#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
view plain
print?
#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
view plain
print?
#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
view plain
print?
#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程式設計
什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...