① c語言 數字交換的問題
主要的問題在於:你寫的這段邏輯,只能當最大或最小數不位於第一或第五位時才能實現數字交換;否則,拿 1 2 3 4 5為例:1先和最大值5換,得到5 2 3 4 1;然後5再和最小值1換,得到1 2 3 4 5;結果相當於沒換; 在拿1 2 5 3 4為例:1先和5換,得到5 2 1 3 4;由於記錄最小值的p2還是0(原先1的位置),4再和a[p2]換的話,就是和5換了,而不再是1,所以會得到4 2 1 3 5;
② 怎樣使用C語言接收網頁的信息
C語言打開網路
#include<stdio.h>
#include<winsock.h>
#pragmacomment(lib,"ws2_32.lib")
voidmain()
{
char*host="www..com";
WSADATAdata;
//winsock版本2.2
interr=WSAStartup(MAKEWORD(2,2),&data);
if(err)
return;
//用域名獲取對方主機名
structhostent*h=gethostbyname(host);
if(h==NULL)
return;
//IPV4
if(h->h_addrtype!=AF_INET)
return;
structin_addrina;
//解析IP
memmove(&ina,h->h_addr,4);
LPSTRipstr=inet_ntoa(ina);
//Socket封裝
structsockaddr_insi;
si.sin_family=AF_INET;
si.sin_port=htons(80);
si.sin_addr.S_un.S_addr=inet_addr(ipstr);
intsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
connect(sock,(SOCKADDR*)&si,sizeof(si));
if(sock==-1||sock==-2)
return;
//發送請求
charrequest[1024]="GET/?st=1HTTP/1.1 Host:";
strcat(request,host);
strcat(request," Connection:Close ");
intret=send(sock,request,strlen(request),0);
//獲取網頁內容
intisstart=0;
while(ret>0)
{
constintbufsize=1024;
char*buf=(char*)calloc(bufsize,1);
ret=recv(sock,buf,bufsize-1,0);
printf("%s",buf);
free(buf);
}
closesocket(sock);
WSACleanup();
return;
}
③ 描述Internet上兩台主機相互通信的流程
主機A與主機B通信,A Ping B,圖:A-交換機-B,AB同一子網
(1)ping數據包用的是ICMP協議,IP協議的一個子協議,位於三層,包含A的IP,B的IP,三層進行IP封裝成包,進入二層
(2)A,B處於相同子網,查看緩存中對與目的對應得B第2層mac地址,如果存在,直接進行第2層封裝成幀,經物理層信號編碼,以0101010010這樣的bits流傳輸在網路介質上。
(3)如果不存在B的MAC,則發送ARP廣播請求B的MAC,ARP數據包經物理層進入交換機埠,需要進行源埠號學習,目的埠查找,B響應ARP請求,交換機又可以學習一目的MAC地址與哪個埠對應,在下次傳送數據時就不再需要對所有埠進行廣播了。B通過ARP單播把B的MAC響應給A,此時再返回(2)的處理過程。
(4)當再進行A與B之間數據包轉發,將直接用B的MAC地址封裝,數據轉發得以高速交換
主機A與主機C通信,A Ping C,圖:A-交換機-路由器M-路由器N-交換機-C,AC不同子網
(1)兩個機器不在同一子網內,A要與目的C通信,A要向「預設網關」發出ARP包,而「預設網關」的IP地址已經在A系統軟體中設置。這個IP地址實際上對應路由器M的E0的IP地址。所以A對「預設網關」的IP地址廣播出一個ARP請求時,路由器M的E0口的MAC回復給A,此時A數據包的目的MAC替換為M的E0口MAC。
(2)MAC替換後,經物理層,傳輸到交換機物理層,再傳到交換機數據鏈路層,再經數據數據鏈路層到物理層。
(3)經bit流傳到路由器M的物理層,然後傳到數據鏈路層,二層解封裝,目的IP與路由器M三層IP路由表比較,若匹配正確,交給上層處理,否則會緩存數據包內容,然後根據目標地址查找路由表找到相關表項,得到NEXT HOP及出介面的MAC地址,用這兩個地址作為新的目的及源MAC地址封裝事先緩存的數據包,然後轉發,這個過程稱為幀的重寫(REWRITE)。
(4)重復進行MAC替換後, 在路由器N中,找到與目的IP匹配表項,若N中存在C對應的MAC表項,則數據傳輸到C網路層,否則N發送ARP廣播請求C的MAC。
(5)當C收到A的數據包後,再從A到C進行一次反向MAC替換過程。反向過程中,每一步省略掉ARP請求NEXT HOP的MAC,因為MAC表已經建立起來。
總結:
IP報文傳輸過程包括:
1. Host sends packet to default gateway(主機將數據包發送到默認網關)
2. Packet placed in frame(數據包被封裝入幀)
3. Router receives frame(路由器接到幀)
4. Router finds destination network in route table(路由器在路由表中發現目標網路)
5. Router chooses next hop toward destination(路由器選擇一個更接近目標的下一跳)
6. MAC address of next hop determined(下一跳的MAC地址被確定)
7. Packet placed in frame(數據包被封裝入幀)
8. Repeats steps 2 through 7 as necessary(如果需要的話,重復步驟2~7)
9. Router receives frame(路由器接到幀)
10. Router finds network directly connected(路由器發現直連網路)
11. MAC address of end host determined(最終主機的MAC地址被確定)
12. Packet placed in frame to final destination(幀中的數據包被發送到最終主機)
④ 怎麼通過C語言讀取網頁裡面的數據
簡單的請求格式
GET /index.php HTTP/1.0
host:www.zixue7.com
當我們和伺服器連接上之後,發送上面的數據過去,伺服器就會返回 index.php 這個頁面給我們。
GET 這個 是表示 以什麼方式請求,HTTP中還有很多其他的請求方式,常用的就 GET POST (更詳細的 可以點開上面 http協議 那個鏈接)
GET 後面緊跟一個空格 然後 給出,要獲取的資源的名稱, /index.php 就表示獲取網站伺服器根目錄下 index.php 執行後所產生的內容,我們也可以改成 GET / HTTP/1.0 這就表示獲取默認首頁的內容 。 GET /1.html HTTP/1.0 就是獲取 伺服器根目錄下 1.html的內容,很容易理解吧。
接下來隔一個空格 跟上 HTTP/1.0 表示 http協議的版本,這個是固定的 。
第二行 host:www.zixue7.com 用來指定 訪問哪個主機。 大家都知道,一個伺服器可以放很多個網站,每個網站有不同的域名,所以我們需要用這個host來指定 我們要訪問的是哪個網站,這樣 才能正確得訪問到我們想訪問的網站。
第一步,連接伺服器。
第二步,按照http協議,發送請求數據,然後就是接受返回的內容。
沒錯,就這么簡單。
在編寫程序之前,我們先用一個小工具來模擬一下這個過程,好讓我們對http協議了解更深入一些。
telnet工具 如果是 win7下的朋友 猛戳這里-->win7開啟telnet功能
到此為止,我假設大家電腦上已經開啟了 telnet功能,正題開始。
telnet 他是一個基於tcp/ip 協議的程序,為我們用戶提供一個 與其他電腦通信的工具,我們可以使用他來和其他電腦進行連接通信。
開始->運行->輸入telnet回車, 出現一個黑框如下。
我們這時就可以輸入命令,來連接遠程主機,比如我們這次是要連接我們自學去論壇 的伺服器,
那麼我們就輸入 open www.zixue7.com 80 然後回車。
open 是打開的意思 後面跟上 要打開那個主機 然後 後面跟上埠, web伺服器默認使用的是80埠,所以 要加上80埠(不加埠 telnet默認是23埠)。
然後會出現下圖的情況,這時候 我們就可以輸入命令了,輸入的命令都將被發送到自學去論壇的伺服器上面。大家注意一下 下圖紅色箭頭所指出的部分,那裡就是一個輸入游標,不用管其他的字。
這就代表 我們已經和遠程主機連接上了,就相當於我們上節課中 客戶端執行到 connect 函數 之後 就是要調用 send函數發送數據了,在這里 我們只需要按鍵盤輸入到黑色窗口中 就會發送到服務端。
我們依次輸入以下內容,(注意,不能按退格,輸入錯誤了,就重新打開telnet,重新操作。)
⑤ 網頁通過TCP/IP協議發送數據,怎麼做
TCP/IP這個協議遵守一個四層的模型概念:應用層、傳輸層、互聯層和網路介面層。
網路介面層
模型的基層是網路介面層。負責數據幀的發送和接收,幀是獨立的網路信息傳輸單元。網路介面層將幀放在網上,或從網上把幀取下來。
互聯層
互聯協議將數據包封裝成internet數據報,並運行必要的路由演算法。
這里有四個互聯協議:
網際協議IP:負責在主機和網路之間定址和路由數據包。
地址解析協議ARP:獲得同一物理網路中的硬體主機地址。
網際控制消息協議ICMP:發送消息,並報告有關數據包的傳送錯誤。
互聯組管理協議IGMP:被IP主機拿來向本地多路廣播路由器報告主機組成員。
傳輸層
傳輸協議在計算機之間提供通信會話。傳輸協議的選擇根據數據傳輸方式而定。
兩個傳輸協議:
傳輸控制協議TCP:為應用程序提供可靠的通信連接。適合於一次傳輸大批數據的情況。並適用於要求得到響應的應用程序。
用戶數據報協議UDP:提供了無連接通信,且不對傳送包進行可靠的保證。適合於一次傳輸小量數據,可靠性則由應用層來負責。
應用層
應用程序通過這一層訪問網路。
網路介面技術
IP使用網路設備介面規范NDIS向網路介面層提交幀。IP支持廣域網和本地網介面技術。
串列線路協議
TCP/IPG一般通過internet串列線路協議SLIP或點對點協議PPP在串列線上進行數據傳送。(是不是我們平時把它稱之為非同步通信,對於要拿LINUX提供建立遠程連接的朋友應該多研究一下這方面的知識)?
IP是一個無連接的協議,主要就是負責在主機間定址並為數據包設定路由,在交換數據前它並不建立會話。因為它不保證正確傳遞,另一方面,數據在被收到時,IP不需要收到確認,所以它是不可靠的。有一些欄位,在當數據從傳輸層傳下來時,會被附加在數據包中,我們來看一下這些欄位:
源IP地址:用IP地址確定數據報發送者。
目標IP地址:用IP地址確定數據報目標。
協議:告知目的機的IP是否將包傳給TCP或UDP。
檢查和:一個簡單的數學計算,用來證實收到的包的完整性。
TTL生存有效時間:指定一個數據報被丟棄之前,在網路上能停留多少時間(以秒計)。它避免了包在網路中無休止循環。路由器會根據數據在路由器中駐留的時間來遞減TTL。其中數據報通過一次路由器,TTL至少減少一秒。根據我們前面提到關於ARP的知識,如果IP地址目標為本地地址時,IP將數據包直接傳給那個主機;如果目標地址為遠程地址的話,IP在本地的路由表中查找遠程主機的路由(看來好象我們平時撥114一樣)。如果找到一個路由,IP用它傳送數據包。如果沒找到呢,就會將數據包發送到源主機的預設網關,也稱之為路由器。(很多時候一直在搞網關和路由器的定義,其實我覺得在學的時候不一定死摳概念,現在硬體和軟體結合的產品越來越多了,一時很分清的,只要我們運用的時候可以解決實際問題嘛。)這樣當路由器收到一個包後,該包向上傳給IP:
(1)如果交通阻塞(聽起來蠻可怕的),包在路由器中停滯,TTL至少減1或更多。要是它降到0的話,包就會被拋棄。
(2)如果對於下一網路來說包太大的話,IP會將它分割成若干個小包。
(3)如果包被分解,IP為每個新包製造一個新頭,其中包括:一個標志,用來顯示其它小包在其後;一個小包ID,用來確定所有小包是一起的;一個小包偏移,用來告訴接收主機怎麼重新組合它們。
(4)IP計算一個新的檢驗和。
(5)IP獲取一個路由的目標硬體地址。
(6)IP轉發包。
在下一主機,包被發送到TCP或UDP。每個路由器都要重復該過程。直到包到達最終目的地。當包到達最終目的地後,IP將小包組裝成原來的包。
TCP是一種可靠的面向連接的傳送服務。它在傳送數據時是分段進行的,主機交換數據必須建立一個會話。它用比特流通信,即數據被作為無結構的位元組流。通過每個TCP傳輸的欄位指定順序號,以獲得可靠性。如果一個分段被分解成幾個小段,接收主機會知道是否所有小段都已收到。通過發送應答,用以確認別的主機收到了數據。對於發送的每一個小段,接收主機必須在一個指定的時間返回一個確認。如果發送者未收到確認,數據會被重新發送;如果收到的數據包損壞,接收主機會舍棄它,因為確認未被發送,發送者會重新發送分段。
埠
SOCKETS實用程序使用一個協議埠號來標明自己應用的唯一性。埠可以使用0到65536之間的任何數字。在服務請求時,操作系統動態地為客戶端的應用程序分配埠號。
套接字
套接字在要領上與文件句柄類似,因為其功能是作為網路通信的終結點。一個應用程序通過定義三部分來產生一個套接字:主機IP地址、服務類型(面向連接的服務是TCP,無連接服務是UDP)、應用程序所用的埠。
TCP埠
TCP埠為信息的傳送提供定地點,埠號小於256的定義為常用埠。
TCP的三次握手
TCP對話通過三次握手來初始化。三次握手的目的是使數據段的發送和接收同步;告訴其它主機其一次可接收的數據量,並建立虛連接。我們來看看這三次握手的簡單過程:
(1)初始化主機通過一個同步標志置位的數據段發出會話請求。
(2)接收主機通過發回具有以下項目的數據段表示回復:同步標志置位、即將發送的數據段的起始位元組的順序號、應答並帶有將收到的下一個數據段的位元組順序號。
(3)請求主機再回送一個數據段,並帶有確認順序號和確認號。
TCP滑動窗口
TCP滑動窗口用來暫存兩台主機間要傳送的數據,有點類似CACHE。每個TCP/IP主機有兩個滑動窗口:一個用於接收數據,另一個用於發送數據。
⑥ 網頁與ACCESS資料庫如何實現數據交互
1.打開access,單機菜單欄創建,選擇表,單擊列,選擇下拉菜單中的欄位類型,單機列名更改欄位名稱。
6.執行c#工程,若彈出「連接成功!」提示框則連接access資料庫成功,否則彈出相應的錯誤信息。
⑦ 數據交換輸出——C語言
第一你沒有讀懂題意。。找出其中最小的數,將它與最前面的數交換後輸出這些數。與最前面的數交換也就是a[0]交換。
第二:在找最小的數時候。有點問題。
應該是for(i=0;i<n;i++)
{
if(a[i]<min)
{
min=a[i];
count=i;
}
}
count 是用來記錄最小的數的下標。要和min=a[i]在一個復合語句中。
第二:你的輸出格式也有問題。
題上要求:對於每組輸入數據,輸出交換後的數列,每組輸出佔一行。要注意輸出一組數據後換行喲~要是還AC不過。。再提問。
⑧ 你好我在做一個嵌入式程序,想用C語言做主程序,QT做UI,請問它們之間用什麼方式交換數據比較好
給你幾套方案
1.C編寫的程序編譯成動態鏈接庫(Windows下是dll),用Qt的QLibrary調用(或者用傳統的API也行),這個方法比較易行
2.使用共享內存(實現方式挺多,比如dll共享內存等)
3.Socket
4.郵槽
5.管道
如果你想做成分離的進程就去看看進程間通信吧。
建議你使用第一種,用C把主要的功能寫好,用Qt實現界面與業務邏輯,需要時調用動態庫里的函數
⑨ c語言怎麼實現兩個數據交換
將兩個數進行互換的方法有兩種形式:
1、藉助中間變數完成,此方法直觀,易理解,使用最多
2、不需要中間變數,通過變數身的運算完成交換。
⑩ html網頁數據交互程序(是不是叫CGI程序我還不清楚)可以是c語言嗎
cgi是最原始的一種,老實說我都沒接觸過。
一般現在比較常用的是asp、php、java、.net這幾種。對於如果有c基礎的人來說這些都是小case很容易就入門了。