久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4817|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

網(wǎng)絡(luò)程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告下載 UDP下socket編程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
網(wǎng)絡(luò)程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告
一、實(shí)驗(yàn)?zāi)康?/strong>
1.熟悉UDP下socket編程,掌握socket編程的具體實(shí)現(xiàn)步驟
2.熟悉進(jìn)程間通信方式,掌握常用IPC編程方法
3.熟悉并發(fā)服務(wù)器模型,掌握一種編程方法
二、實(shí)驗(yàn)內(nèi)容
1.用UDP套接字實(shí)現(xiàn)流式通信
2.用管道,套接字,共享內(nèi)存實(shí)現(xiàn)一個(gè)大文件的傳輸并比較他們的速率
3.創(chuàng)建一個(gè)TCP并發(fā)服務(wù),并可支持?jǐn)帱c(diǎn)續(xù)傳。
三、實(shí)驗(yàn)步驟
1.用UDP套接字實(shí)現(xiàn)流式通信
基于UDP套接字的編程模型如下:              




其中,在服務(wù)器端,服務(wù)器創(chuàng)建socket描述符,并將該描述符邦定到本服務(wù)器地址上,接著調(diào)用接收函數(shù)recvfrom,如果此時(shí)客戶端沒有發(fā)來UDP請求,服務(wù)器一直阻塞在recvfrom函數(shù)。當(dāng)服務(wù)器接收到客戶端發(fā)來的UDP請求后,服務(wù)器端繼續(xù)執(zhí)行recvfrom函數(shù)之后的代碼,處理客戶端請求,處理完成后再通過sendto函數(shù)無阻塞地將處理結(jié)果返回到客戶端,之后服務(wù)器端循環(huán)又回到recvfrom函數(shù),等待客戶端的UDP請求。
在客戶端,用戶創(chuàng)建socket描述符,并將該描述符邦定到指定的服務(wù)器地址上,接著調(diào)用發(fā)送函數(shù)sendto將客戶端的請求通過UDP無阻塞地發(fā)送到服務(wù)器,接著執(zhí)行到接收函數(shù)recvfrom,如果服務(wù)器還沒有UDP請求發(fā)送到客戶端,客戶端一直阻塞在該函數(shù)。當(dāng)服務(wù)器執(zhí)行完客戶端的請求,并把結(jié)果通過UDP發(fā)送到客戶端后,客戶端接收結(jié)果,最后客戶端關(guān)閉socket端口,客戶端與服務(wù)器的一次對話結(jié)束。

2.用管道,套接字,文件共享實(shí)現(xiàn)一個(gè)大文件的傳輸
(1)管道可以用于具有親緣關(guān)系的進(jìn)程間通信,命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系的進(jìn)程之間通信。當(dāng)進(jìn)程創(chuàng)建一個(gè)管道的時(shí)候,系統(tǒng)內(nèi)核同時(shí)為該進(jìn)程設(shè)立了一對文件句柄,一個(gè)用來從管道獲取數(shù)據(jù),另一個(gè)用來向管道輸出數(shù)據(jù),如圖2-1。在主進(jìn)程中利用fork()函數(shù)創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程繼承了父進(jìn)程打開的文件句柄,利用繼承的句柄,就可以實(shí)現(xiàn)父子進(jìn)程之間的通信,如圖2-2。
現(xiàn)在,父子兩個(gè)進(jìn)程同時(shí)擁有對同一個(gè)管道的讀寫句柄,因?yàn)楣艿辣仨毷菃蜗虻模赃需要決定數(shù)據(jù)的流動方向是從父進(jìn)程到子進(jìn)程還是從子進(jìn)程到父進(jìn)程,然后在每個(gè)進(jìn)程中關(guān)閉不需要的句柄。假設(shè)需要利用管道完成從父進(jìn)程向子進(jìn)程傳送數(shù)據(jù),關(guān)閉了相應(yīng)句柄后的管道如圖2-3所示。


通過以上操作后,建立好像完整的管道數(shù)據(jù)通路,就可以利用標(biāo)準(zhǔn)的讀寫函數(shù)read()、write()對管道進(jìn)行讀寫操作了。
在具體的C程序中,使用pipe()函數(shù)來建立管道。它只有一個(gè)參數(shù):一個(gè)有兩個(gè)成員的整形數(shù)組,用于存放pipe()函數(shù)新建立的管道句柄。
(2)套接字是兩個(gè)通信通道上得端點(diǎn)。套接字函數(shù)可以用來產(chǎn)生通信信道,通過信道兩個(gè)應(yīng)用程序間可以傳送數(shù)據(jù)。由于需要傳輸?shù)氖俏募赃x擇安全機(jī)制較高的TCP套接字。基于TCP套接字的編程模型如下:





在服務(wù)器端,服務(wù)器創(chuàng)建socket描述符,將該描述符邦定到自己的IP地址上,再設(shè)置最大連接請隊(duì)列長度,接著用accept接收請求函數(shù)等待客戶端的請求,如果沒有收到客戶端的請求,服務(wù)器就阻塞在此。收到客戶端請求后,服務(wù)器讀取該請求,經(jīng)過處理,最后將處理結(jié)果通過write寫函數(shù)返回到客戶端。
在客戶端,用戶程序創(chuàng)建socket描述符,并用connet連接函數(shù)將該描述符連接到服務(wù)器的地址上,連接上后客戶端通過write寫函數(shù)將請求發(fā)送到服務(wù)器,服務(wù)器經(jīng)過處理將結(jié)果返回客戶端,客戶端通過read函數(shù)讀取處理結(jié)果,當(dāng)服務(wù)器沒有結(jié)果返回時(shí),客戶端將一直阻塞在read函數(shù)。
(3)共享內(nèi)存實(shí)現(xiàn)進(jìn)程間通信,系統(tǒng)在內(nèi)存中指定一個(gè)區(qū)域作為共享存儲區(qū)域,建立一張表進(jìn)行管理,各進(jìn)程可以申請其中的一個(gè)存儲段,并在申請時(shí)提供關(guān)鍵字。若申請的存儲區(qū)已經(jīng)被其他進(jìn)程所有,則系統(tǒng)向申請進(jìn)程返回關(guān)鍵字,該存儲區(qū)就連接了進(jìn)程的邏輯地址空間,此后進(jìn)程就可以直接存取共享存儲區(qū)中的數(shù)據(jù)了;若申請的存儲段尚未分配,則系統(tǒng)會按照申請者的要求分配存儲段,并在段表中加入該進(jìn)程的信息。一個(gè)進(jìn)程可以申請多個(gè)存儲段,使用共享存儲區(qū)進(jìn)行通信時(shí)進(jìn)程間的互斥或同步要靠其他的機(jī)構(gòu)來解決。
在調(diào)試代碼的時(shí)候發(fā)現(xiàn)用共享內(nèi)存的方式傳輸一個(gè)5MB左右的文件的時(shí)候可以,但是傳輸100多MB的文件時(shí),創(chuàng)建共享內(nèi)存的函數(shù)shmget()返回報(bào)錯(cuò)。在網(wǎng)上搜也沒有搜到合適的解答,后來偶然發(fā)現(xiàn)了shmmax這個(gè)參數(shù),在往上搜索這個(gè)參數(shù)發(fā)現(xiàn)Linux對共享內(nèi)存的大小有限制。后來找到了解決的辦法,用echo 268435456 > /proc/sys/kernel/shmmax 指令臨時(shí)把系統(tǒng)最大共享內(nèi)存限制提高到256MB,之后再調(diào)試程序,發(fā)現(xiàn)大文件可以傳輸,問題解決。但隨后又發(fā)現(xiàn)一個(gè)問題,在用共享內(nèi)存方式傳送小文件時(shí)速度很快,平均300MB/s左右。但在傳送大文件時(shí),速度比較慢,平均幾十MB/s左右,對于該問題,我也沒弄清是怎么回事。

3.創(chuàng)建一個(gè)TCP并發(fā)服務(wù),支持?jǐn)帱c(diǎn)續(xù)傳
原本打算參考一個(gè)Linux下的基于命名行的開源Ftp客戶端軟件cmdftp,找的是比較原始的0.7.3版本,代碼不多,不到3000行,但是自己閱讀之后發(fā)下里面的命令解析過于復(fù)雜,而且應(yīng)用層用的Ftp協(xié)議也比較龐大;找了開源的Ftp服務(wù)器端軟件,發(fā)現(xiàn)異常龐大,在短時(shí)間內(nèi)幾乎不可能完成。所以最后采用了網(wǎng)上的一個(gè)基于MFC開發(fā)的Windows下的局域網(wǎng)文件傳輸工具。

四、實(shí)驗(yàn)結(jié)果
以上各個(gè)實(shí)驗(yàn)均在Fedora9下,使用Qt Creator開發(fā)環(huán)境調(diào)試通過,各個(gè)實(shí)驗(yàn)的結(jié)果截圖如下:
1.用UDP套接字實(shí)現(xiàn)流式通信



客戶端程序運(yùn)行情況
服務(wù)器端程序運(yùn)行情況
QT4開發(fā)環(huán)境
2.用管道,套接字,文件共享實(shí)現(xiàn)一個(gè)大文件的傳輸

管道傳輸
QT4開發(fā)環(huán)境
套接字傳輸客戶端
套接字傳輸服務(wù)器端
QT4開發(fā)環(huán)境
共享內(nèi)存?zhèn)鬏敚ㄐ∥募?/font>
共享內(nèi)存?zhèn)鬏敚ù笪募?/font>
可以看出,除了用共享內(nèi)存?zhèn)鬏敶笪募ㄟ@種情況下為何速度不高沒有弄清楚)這種情況。傳輸速度依次為:
管道:42 MB/s
套接字:47 MB/s
共享內(nèi)存:300 MB/s
無疑,共享內(nèi)存速度最快,按照理論管道應(yīng)該比套接字速度快,但本實(shí)驗(yàn)中發(fā)現(xiàn)套接字竟然比管道速度快,這個(gè)問題也沒有弄清楚。
QT4卡開發(fā)環(huán)境
3.創(chuàng)建一個(gè)TCP并發(fā)服務(wù),支持?jǐn)帱c(diǎn)續(xù)傳

服務(wù)器端傳輸程序界面
客戶端接收程序界面
五、實(shí)驗(yàn)總結(jié)
通過本次課程設(shè)計(jì),初步了解了Linux下的網(wǎng)絡(luò)程序設(shè)計(jì)的步驟,對基于套接字的編程有了個(gè)新的認(rèn)識。Qt集成開發(fā)環(huán)境使Linux下的C/C++開發(fā)方便了許多,無論是代碼編寫還是調(diào)試運(yùn)行。雖然沒有獨(dú)立完成最后一題,但也通過在嘗試自己編寫,自己閱讀開源的小型Ftp客戶端軟件,對Linux的Shell編程有了新的認(rèn)識,尤其對如何利用標(biāo)準(zhǔn)C編寫跨平臺程序。總體通過這次作業(yè),收獲到了很多以前不了解或了解不深入的東西,對網(wǎng)絡(luò)程序設(shè)計(jì)有了新的認(rèn)識。

下面是部分源碼,完整代碼請下載51黑的附件:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include

  10. int main(int argc, char ** argv)
  11. {
  12.     if(argc != 2)
  13.     {
  14.         printf("usage: udp_client portnum");
  15.         exit(1);
  16.     }
  17.     short port = atoi(argv[1]);
  18.     int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  19.     if(sockfd == -1)
  20.     {
  21.         printf("error create socket!");
  22.         exit(1);
  23.     }

  24.     struct sockaddr_in srvaddr;
  25.     srvaddr.sin_family = AF_INET;
  26.     srvaddr.sin_port = htons(port);
  27.     if(inet_aton("127.0.0.1", &srvaddr.sin_addr) == -1)
  28.     {
  29.         printf("error address convert!");
  30.         exit(1);
  31.     }

  32.     char buf[100];
  33.     struct timeval time;

  34.     while(1)
  35.     {
  36.         gettimeofday(&time, NULL);
  37.         sprintf(buf,"this is hello from client! %d",(int)time.tv_sec);
  38.         sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
  39.         sleep(1);
  40.     }

  41. }
復(fù)制代碼
論文和程序下載:

網(wǎng)絡(luò)程序設(shè)計(jì)報(bào)告 源碼.rar (2.06 MB, 下載次數(shù): 9)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区在线免费观看 | 国产成人午夜高潮毛片 | 欧美亚洲国产一区二区三区 | www视频在线观看 | 欧美亚洲视频在线观看 | 天天曰夜夜操 | 99精品在线| 国产日产精品一区二区三区四区 | 久久亚洲国产 | 国产在线一区二区三区 | 欧美成人性生活 | 国产精品视频在线观看 | 日韩爱爱网站 | 成人av一区二区在线观看 | 国产欧美精品在线 | 欧美区在线| 亚洲日韩中文字幕一区 | 久久久久久亚洲 | 久久99视频免费观看 | 91麻豆久久久 | 日韩av在线一区二区 | 午夜看电影在线观看 | 精品一级| 久久综合入口 | 天天射美女 | 精品1区 | 日日夜夜狠狠操 | 超碰网址 | 91在线视频网址 | 久久久久一区 | 成人性视频在线播放 | 精品国模一区二区三区欧美 | aa级毛片毛片免费观看久 | 成人三区 | 国产精品久久久久久久久污网站 | 五月婷婷丁香婷婷 | 久久中文字幕在线 | 亚洲不卡在线视频 | 国产在线一区二区 | 欧美bondage紧缚视频 | 欧美日韩在线一区二区 |