ANSI

休寧縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
C規(guī)定文件打開用函數(shù)fopen,關(guān)閉為fclose。
1、調(diào)用方式通常為:
代碼如下:
FILE
*fp;
fp=fopen(文件名,
打開方式);
2、參數(shù)說明:
文件名:
形如"myfile.dat"、"F:\data\myfile.dat"等等;
打開方式:
"r"(只讀)
為輸入打開一個(gè)文本文件
"w"(只寫)
為輸出打開一個(gè)文本文件
"a"(追加)
向文件文件尾添加數(shù)據(jù)
"rb"(只讀)
為輸入打開一個(gè)二進(jìn)制文件
"wb"(只寫)
為輸出打開一個(gè)二進(jìn)制文件
"r+"(讀寫)
為讀寫打開一個(gè)文本文件
"w+"(讀寫)
為讀寫建立一個(gè)新的文本文件
"a+"(讀寫)
為讀寫打開一個(gè)文本文件
"rb+"(讀寫)
為讀寫打開一個(gè)二進(jìn)制文件
"wb+"(讀寫)
為讀寫建立一個(gè)新的二進(jìn)制文件
"ab+"(讀寫)
為讀寫打開一個(gè)二進(jìn)制文件
3、注意:
(1)用"r"方式打開的文件,不能向其輸入數(shù)據(jù),并且該文件已存在,否則出錯(cuò);
(2)用"w"方式打開的文件,只能向該文件輸入數(shù)據(jù),如果所打開的文件不存在,則在打開時(shí)新建一個(gè)以指定的名字命名的文件;如果指定文件存在,則在打開時(shí)將該文件刪去,然后新建一個(gè)新的文件;
(3)如果函數(shù)fopen打開文件出錯(cuò),則fopen返回一個(gè)空指針值NULL;
(4)在程序開始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開3個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入(stdin),標(biāo)準(zhǔn)輸出(stdout),標(biāo)準(zhǔn)出錯(cuò)輸
出(stderr)。如果要使用輸入輸出終端,則不需要打開,可以直接使用,如fputc(stdout,'a');向屏幕輸出字符a。
參考代碼如下:
#include?windows.h
int?main(void)
{
ShellExecute(NULL,?"open",?"",?NULL,?NULL,?SW_MINIMIZE);
return?0;
}
例子中是最小化打開的,還可以是最大化SW_MAXIMIZE,隱藏SW_HIDE等。
C語言中open函數(shù)
作用:打開和創(chuàng)建文件。
簡述:
1
2
3
4
#includefcntl.h
intopen(constchar*pathname,intflags);
intopen(constchar*pathname,intflags,mode_tmode);
返回值:成功則返回文件描述符,否則返回-1
對于open函數(shù)來說,第三個(gè)參數(shù)僅當(dāng)創(chuàng)建新文件時(shí)(即
使用了O_CREAT
時(shí))才使用,用于指定文件的訪問權(quán)限位(access
permission
bits)。pathname
是待打開/創(chuàng)建文件的POSIX路徑名(如/home/user/a.cpp);flags
用于指定文件的打開/創(chuàng)建模式,這個(gè)參數(shù)可由以下常量(定義于fcntl.h)通過邏輯位或邏輯構(gòu)成。
1
2
3
O_RDONLY只讀模式
O_WRONLY只寫模式
O_RDWR讀寫模式
打開/創(chuàng)建文件時(shí),至少得使用上述三個(gè)常量中的一個(gè)。以下常量是選用的:
1
2
3
4
5
6
O_APPEND每次寫操作都寫入文件的末尾
O_CREAT如果指定文件不存在,則創(chuàng)建這個(gè)文件
O_EXCL如果要?jiǎng)?chuàng)建的文件已存在,則返回-1,并且修改errno的值
O_TRUNC如果文件存在,并且以只寫/讀寫方式打開,則清空文件全部內(nèi)容(即將其長度截短為0)
O_NOCTTY如果路徑名指向終端設(shè)備,不要把這個(gè)設(shè)備用作控制終端。
O_NONBLOCK如果路徑名指向FIFO/塊文件/字符文件,則把文件的打開和后繼I/O
設(shè)置為非阻塞模式
1
(nonblockingmode)
以下三個(gè)常量同樣是選用的,它們用于同步輸入輸出
1
2
3
4
O_DSYNC等待物理I/O結(jié)束后再write。在不影響讀取新寫入的數(shù)據(jù)的
前提下,不等待
文件屬性
更新。
1
2
O_RSYNCread等待所有寫入同一區(qū)域的寫操作完成后再進(jìn)行
O_SYNC等待物理I/O結(jié)束后再write,包括更新文件屬性的I/O
open返回的文件描述符一定是最小的未被使用的描述符。
如果
NAME_MAX(文件名最大長度,不包括'\0')是
14,而我們想在當(dāng)前目錄下創(chuàng)建文件名長度超過
14
字節(jié)的文件,早期的
System
V
系統(tǒng)(如
SVR2)會截?cái)喑霾糠?,只保留?/p>
14
個(gè)字節(jié);而由
BSD
衍生的(BSD-derived)系統(tǒng)會返回錯(cuò)誤信息,并且把
errno
置為
ENAMETOOLONG。
POSIX.1
引入常量
_POSIX_NO_TRUNC
用于決定是否截?cái)嚅L文件名/長路徑名。如果_POSIX_NO_TRUNC
設(shè)定為禁止截?cái)?,并且路徑名長度超過
PATH_MAX(包括
'\0'),或者組成路徑名的任意文件名長度超過
NAME_MAX,則返回錯(cuò)誤信息,并且把
errno
置為
ENAMETOOLONG。
簡單的請求格式
GET /index.php HTTP/1.0
host:
當(dāng)我們和服務(wù)器連接上之后,發(fā)送上面的數(shù)據(jù)過去,服務(wù)器就會返回 index.php 這個(gè)頁面給我們。
GET 這個(gè) 是表示 以什么方式請求,HTTP中還有很多其他的請求方式,常用的就 GET POST (更詳細(xì)的 可以點(diǎn)開上面 http協(xié)議 那個(gè)鏈接)
GET 后面緊跟一個(gè)空格 然后 給出,要獲取的資源的名稱, /index.php 就表示獲取網(wǎng)站服務(wù)器根目錄下 index.php 執(zhí)行后所產(chǎn)生的內(nèi)容,我們也可以改成 GET / HTTP/1.0 這就表示獲取默認(rèn)首頁的內(nèi)容 。 GET /1.html HTTP/1.0 就是獲取 服務(wù)器根目錄下 1.html的內(nèi)容,很容易理解吧。
接下來隔一個(gè)空格 跟上 HTTP/1.0 表示 http協(xié)議的版本,這個(gè)是固定的 。
第二行 host: 用來指定 訪問哪個(gè)主機(jī)。 大家都知道,一個(gè)服務(wù)器可以放很多個(gè)網(wǎng)站,每個(gè)網(wǎng)站有不同的域名,所以我們需要用這個(gè)host來指定 我們要訪問的是哪個(gè)網(wǎng)站,這樣 才能正確得訪問到我們想訪問的網(wǎng)站。
第一步,連接服務(wù)器。
第二步,按照http協(xié)議,發(fā)送請求數(shù)據(jù),然后就是接受返回的內(nèi)容。
沒錯(cuò),就這么簡單。
在編寫程序之前,我們先用一個(gè)小工具來模擬一下這個(gè)過程,好讓我們對http協(xié)議了解更深入一些。
telnet工具 如果是 win7下的朋友 猛戳這里--win7開啟telnet功能
到此為止,我假設(shè)大家電腦上已經(jīng)開啟了 telnet功能,正題開始。
telnet 他是一個(gè)基于tcp/ip 協(xié)議的程序,為我們用戶提供一個(gè) 與其他電腦通信的工具,我們可以使用他來和其他電腦進(jìn)行連接通信。
開始-運(yùn)行-輸入telnet回車, 出現(xiàn)一個(gè)黑框如下。
我們這時(shí)就可以輸入命令,來連接遠(yuǎn)程主機(jī),比如我們這次是要連接我們自學(xué)去論壇 的服務(wù)器,
那么我們就輸入 open 80 然后回車。
open 是打開的意思 后面跟上 要打開那個(gè)主機(jī) 然后 后面跟上端口, web服務(wù)器默認(rèn)使用的是80端口,所以 要加上80端口(不加端口 telnet默認(rèn)是23端口)。
然后會出現(xiàn)下圖的情況,這時(shí)候 我們就可以輸入命令了,輸入的命令都將被發(fā)送到自學(xué)去論壇的服務(wù)器上面。大家注意一下 下圖紅色箭頭所指出的部分,那里就是一個(gè)輸入光標(biāo),不用管其他的字。
這就代表 我們已經(jīng)和遠(yuǎn)程主機(jī)連接上了,就相當(dāng)于我們上節(jié)課中 客戶端執(zhí)行到 connect 函數(shù) 之后 就是要調(diào)用 send函數(shù)發(fā)送數(shù)據(jù)了,在這里 我們只需要按鍵盤輸入到黑色窗口中 就會發(fā)送到服務(wù)端。
我們依次輸入以下內(nèi)容,(注意,不能按退格,輸入錯(cuò)誤了,就重新打開telnet,重新操作。)
給你一個(gè)哈,我自己調(diào)試好的,并且加了詳細(xì)注釋~~記得給分啊,我沒分問問題了~
#include stdlib.h
#include stdio.h
#include unistd.h
#include fcntl.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h
#include errno.h
#include time.h
#include sys/types.h
#include sys/ioctl.h
#include string.h
#include stdarg.h
#include netdb.h
#include setjmp.h
#include signal.h
/*gethostbyname 超時(shí)返回
這里使用的辦法是設(shè)置一個(gè)時(shí)鐘,如果gethostbyname在指定的時(shí)間內(nèi)尚未返回,
時(shí)鐘會強(qiáng)制其返回,得到的返回值顯然是空指針,等價(jià)于告訴用戶主機(jī)未連如互聯(lián)網(wǎng)或者該域名無法解析。*/
static sigjmp_buf jmpbuf;
static void alarm_func() //該函數(shù)執(zhí)行之后會執(zhí)行跳轉(zhuǎn)
{
siglongjmp(jmpbuf, 1);
}
static struct hostent *gngethostbyname(char *HostName, int timeout)
{
struct hostent *lpHostEnt;
signal(SIGALRM, alarm_func); //接受alarm信號,然后調(diào)用函數(shù)
if(sigsetjmp(jmpbuf, 1) != 0)//跳轉(zhuǎn)目的地
{
alarm(0);//timout
signal(SIGALRM, SIG_IGN);
return NULL;
}
alarm(timeout);//setting alarm
printf("\nwill gethost!\n");
lpHostEnt = gethostbyname(HostName);
signal(SIGALRM, SIG_IGN);
return lpHostEnt;
}
/*(linux socket編程實(shí)現(xiàn)connect超時(shí)的一種方法
創(chuàng)建套接字,將其設(shè)置成非阻塞狀態(tài)。
調(diào)用connect連接對端主機(jī),如果失敗,判斷當(dāng)時(shí)的errno是否為EINPROGRESS,也就是說是不是連接正在進(jìn)行中,如果是,轉(zhuǎn)到步驟3,如果不是,返回錯(cuò)誤。
用select在指定的超時(shí)時(shí)間內(nèi)監(jiān)聽套接字的寫就緒事件,如果select有監(jiān)聽到,證明連接成功,否則連接失敗。*/
int main(int argc, char *argv[])
{
//最好檢查一下參數(shù),要求傳入3個(gè)參數(shù) URL PORT TIMEOUT(connect send recv 3個(gè)參數(shù)的超時(shí))
int fd, retval,res,error;
struct sockaddr_in addr;
struct timeval timeo = {15, 0}; //time ou struct
struct hostent *site;
socklen_t len = sizeof(timeo);
fd_set set;
fd = socket(AF_INET, SOCK_STREAM, 0);
if (argc == 4)
timeo.tv_sec = atoi(argv[3]);
site=gngethostbyname(argv[1],3); //解析域名的超時(shí)設(shè)置,測試域名超時(shí),可以寫一個(gè)可以ping的通但是沒有辦法解析域名
//的IP地址到resolv.conf里面,然后加上一個(gè)默認(rèn)路由,直接PING一個(gè)百度,就能發(fā)現(xiàn)如果不加超時(shí)機(jī)制就會一直卡在那里
if(NULL == site)
{
printf("\ncan not find the site!\n");
return -2;
}
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); //設(shè)置為非阻塞模式
addr.sin_family = AF_INET;
//addr.sin_addr.s_addr = inet_addr(argv[1]);
memcpy(addr.sin_addr, site-h_addr_list[0], site-h_length);
addr.sin_port = htons(atoi(argv[2]));
printf("%d\n", time(NULL));
/*if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) == 0) {
printf("connected1\n");
// return 0;
}*/
//res=connect(fd, (struct sockaddr*)addr, sizeof(addr));
//printf("\nconnect result:[%d]\n",res);
if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) != 0)
{
//調(diào)用一次系統(tǒng)函數(shù)失敗后直接看errno,確定是什么問題,下面的代碼可以實(shí)現(xiàn)在沒有默認(rèn)路由的情況下直接返回失敗.
if (errno != EINPROGRESS) {
printf("connect:normal network unreach!!");
return -1;
}
printf("\nwill select\n");
FD_ZERO(set);/*將set清零使集合中不含任何fd*/
FD_SET(fd,set); /*將一個(gè)給定的文件描述符加入集合之中*/
retval = select(fd + 1, NULL, set, NULL, timeo);
if (retval == -1) {
printf("select");
return -1;
} else if(retval == 0) {
printf("timeout\n"); //這樣的select等于是變成了再timeout時(shí)間內(nèi)是阻塞模式,超過timeout就直接返回
printf("%d\n", time(NULL));
return 0;
}
else
{
printf("connected---:[%d]\n",retval);
getsockopt(fd, SOL_SOCKET, SO_ERROR, error, (socklen_t *)len); //判斷在connected成功之后,獲取套接口目前的一些信息來判斷是否真的是連接上了,返回0表示真的連上了
printf("error---:[%d]\n",error);
if(0!=error)
return -1;
}
}
int ul = 0;
ioctl(fd, FIONBIO, ul); //設(shè)置為阻塞模式
//return 0;
setsockopt(fd,SOL_SOCKET,SO_SNDTIMEO,(char *)timeo,sizeof(timeo));
setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(char *)timeo,sizeof(timeo));
printf("\nbefore\n");
sleep(5); //在sleep 5的時(shí)候,拔掉網(wǎng)線就可以測試出recv超時(shí)的功能,如果不加recv 的超時(shí)功能,拔掉網(wǎng)線后就會一直卡在那里,當(dāng)然你在實(shí)際應(yīng)用的時(shí)候沒必要加這個(gè)
printf("\nafter\n");
char *msg="GET / HTTP/1.0\r\n\r\n";
if( send(fd, msg, strlen(msg), 0)0 )
{
printf("error in send msg\n");
exit(1);
}
int i=0;
char buf[1000];
while((recv(fd,buf,1000,MSG_WAITALL))0)
{
printf("[%d]:[%s]",i,buf);
i++;
}
printf("\n------end---------\n");
close(fd);
return;
}
當(dāng)前名稱:c語言中打開網(wǎng)頁的函數(shù) C語言打開網(wǎng)頁
本文來源:http://www.jbt999.com/article38/hjghpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、虛擬主機(jī)、關(guān)鍵詞優(yōu)化、、用戶體驗(yàn)、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)