} //取出首部Length域中的數(shù)值,該數(shù)值為內(nèi)容部分的長度
return(read-all(sockfd,bur,n));//從接收緩沖區(qū)中讀出請(qǐng)求的內(nèi)容部分
}
int get-char(int fd,char*ch){
static int offset=0;
static int size=0;
static char buff[1024];
//聲明靜態(tài)變量,在get_char多次被調(diào)用期間,該變量的內(nèi)存不釋放
for(;size<=0 | | (8) ;){
size=read(fd,bur,1024);//一次從套接字緩沖區(qū)中讀出一個(gè)數(shù)據(jù)塊
if(size<0){
if(errno==EINTR){
size=0;
contine;
//EINTR表示本次讀操作沒有成功,但可以繼續(xù)使用該套接字讀出數(shù)i
}else
return(-1);
}
offset=0; //讀出數(shù)據(jù)后,將偏址置為0
*ch=buf[offset ++]; //將當(dāng)前的字符取出,并將偏址移向下一字符
return (1) ;
}
int read _ line(int fd,char*buf,int msxlen){
int i, n;
char ch;
for(i=0;i< (9) ){
n=get_char(fd,&ch);//取出一個(gè)字符
if(n==1){
buff[i++]=ch;//將字符加入字符串中
if( (10) )break;
}else if(n<)return(-1);
else break;
}
buf[i]=`\0`;
return(i);
}
//函數(shù)read_line的作用是讀出請(qǐng)求的首部,其處理的方法是每次調(diào)用get_char函數(shù),取出一個(gè)字符,檢查該字符是否是回車符`\n`,如果是回車符,就返回請(qǐng)求的首部
//get_char的處理方式較為特殊,并不是每次調(diào)用read函數(shù)讀一個(gè)字符,而是一次從緩沖區(qū)中讀一塊內(nèi)容,再一次一個(gè)字符提交給函數(shù)read_line,如果提交完了就再讀一塊,這樣就可以提高讀緩沖區(qū)的效率。另外,由于客戶機(jī)是分兩次調(diào)用writ_all函數(shù)將請(qǐng)求的首部和內(nèi)容發(fā)送給服務(wù)器,因此get_char不會(huì)取出請(qǐng)求內(nèi)容部分的字符
部分SOCKET數(shù)據(jù)結(jié)構(gòu)與函數(shù):
1.地址結(jié)構(gòu)。
sockaddr-in:
sockaddr_in類型的結(jié)構(gòu)定義,sockaddr_in是通用套接字結(jié)構(gòu)sockaddr在TCP/IP協(xié)議下的結(jié)構(gòu)重定義,為TCP/IP套接字地址結(jié)構(gòu)。
Struct sockaddr_in{
short int sin_family;//地址類型AF_XXX,其中AF_INET為TCP/IP專用
unsigned short int sin _port;//端口號(hào)
struct in_addr sin_addr;//Internet地址
//端口號(hào)以及Internet地址使用的是網(wǎng)絡(luò)字節(jié)順序,需要通過函數(shù)htons轉(zhuǎn)換
}
struct_inaddr{
_u32 s_addr;//類型為unsignel long
}
hostent:
hostent類型的結(jié)構(gòu)定義
struct hostnet{
char*h_name;//主機(jī)的正式名稱
char**h_aliases;//別名列表
nit h_addrtvPe;//主機(jī)地址類型:AF_XXX
int h_length;//主機(jī)地址長度:4字節(jié)(32位)
char**h_addr_list;//主機(jī)IP地址列表
}
#define h_addr h_addr_list[0]
2.基本函數(shù)。
int socket(int domain,int type,int protocol);
函數(shù)socket創(chuàng)建一個(gè)套接字描述符,如果失敗則返回-1。domain為地址類型,type為套接字類型,本題中為SOCK_STREAM;protocol指定協(xié)議,本題中為0。
int connect(int sockfd,struct sockaddr*servaddr,int addrlen);
函數(shù)connect與服務(wù)器建立一個(gè)連接,成功返回0,失敗返回-1。servaddr為遠(yuǎn)程服務(wù)器的套接字地址,包括服務(wù)器的IP地址和端口號(hào);addrlen為地址的長度。
int read(int fd,char*bur,int len);
int write(int fd,char*buf,int len);
希望與其他軟考考生進(jìn)行交流?點(diǎn)擊進(jìn)入軟考論壇>>>
更多信息請(qǐng)?jiān)L問:考試吧軟件水平考試欄目
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |