htons(), ntohl(), ntohs(),htons()函式
網路位元組順序與本地位元組順序之間的轉換
htonl()--"host to network long"
ntohl()--"network to host long"
htons()--"host to network short"
ntohs()--"network to host short"
在unix下寫socket程式可能是最方便,你只要掌握其一般步驟,就可以松的寫出面向傳輸層的應用。
1、理解幾個常用的socket函式
#include
#include
int socket(int domain,int type,int portocol);
domain指所使用的協議族(family)可以為af_unix和af_inet,一般只用af_inet(指internet)type指所用的傳輸型別,可以為sock_steram(面向連線的tcp),和sock_dgram(面向無連線的udp)
int bind(int s,const struct sockaddr *address,size_t address_len);
s為socket返回的檔案描述符
address為協議族名稱和其他資訊
具體結構為struct sockaddr_in;
int listen(int s,int backlog);
backlog為容許的請求數目
int accept(int s,struct sockaddr *address,int *address_len);
這裡的前兩個引數同上
addres_len是要傳遞乙個記有結構大小的位址
int connect(int s,struct sockaddr *address,size_t address_len);
這裡的引數意義同bind
2.理解建立程式的一般呼叫過程
要建立乙個處理連線的伺服器端程式,首先要呼叫socket函式建立乙個socket,返回乙個檔案控制代碼fd,使以後對它的操作就象對普通檔案裝置一樣讀寫。
由於是伺服器端必須對乙個斷口進行監聽其他機器的請求,所以接下去呼叫bind函式,傳入剛才的fd,定義好位址和埠,由於是要接受來自任何host的連線所以應講sin_addr賦為inaddr_any,port為你所設定的埠。
注意:這裡的位址和埠是網路位元組順序,所以要呼叫htonl,htons完成主機位元組順序
到網路位元組的轉變
接 下來就是監聽listen,呼叫accept接受來自客戶端的請求,accpet返回連線後的檔案描述符,你就可以用它進行收發資訊(對應於read, write)這樣的乙個過程就是socket->bind->listen->accpet->read,write
而對於客戶端則是socket->connect->read,write
3.乙個完整的程式
#include
#include
#include /*包含有htons等函式的標頭檔案*/
#include
#include
void main()
myaddr.sin_family=af_inet;
myaddr.sin_addr.s_addr=htonl(inaddr_any);
myaddr.sin_port=htons(8888);
ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if (ret<0)
listen(listenfd,10);
len=sizeof(struct sockaddr);
while(1)
printf("connect from %s %d/n",inet_ntoa(cliaddr.sin_addr.s_addr),
ntohs(cliaddr.sin_port));
switch(pid=fork())}}
4.程式說明
該程式的功能是監聽8888埠的連線,對所有的對8888埠的連線顯示出位址和對方的埠號該程式在sco unix下除錯通過,在其他unix和linux平台請注意inet_ntoa,htons函式所應在的標頭檔案的名稱
同時該程式用到了併發的觀點,因為accept,read,write均為阻塞(block)的函式,一旦程序block將不能處理其他請求,所以用主程序進行listen,由子程序進行負責對客戶端傳輸資料.
你可以在同一臺unix機器用telnet localhost 8888進行觀察程式會輸出connect from 127.0.0.1 ***x
zz Unix下編寫Socket程式一般步驟
unix下編寫socket程式的一般步驟 ackarlix 理解幾個常用的socket函式 include include int socket int domain,int type,int portocol domain指所使用的協議族 family 可以為af unix和af inet,一般只...
Unix系列shell程式編寫2
2 bsh裡特殊字元及其含義 在bsh中有一組非字母字元。這些字元的用途分為四類 作為特殊變數名 產生檔名 資料或程式控制以及引用和逃逸字元控制。他們 可以讓使用者在shell中使用最少的 完成複雜的任務。shell變數名使用的特殊字元 傳送給命令shell的引數序號 在shell啟動或使用set命...
Unix系列shell程式編寫6
與或結構 使用與 或結構有條件的執行命令 shell程式中可以使用多種不同的方法完成相同的功能,例如until和while語句就可以完成相同的功能,同樣,除了if then else結構可以使命令有條件的執行外,和 操作符也能完成上述功能。在c語言中這兩個操作符分別表示邏輯與和邏輯或操作。在bour...