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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4879|回復: 0
收起左側

網絡程序設計實驗報告下載 UDP下socket編程

[復制鏈接]
ID:108615 發(fā)表于 2016-3-14 15:40 | 顯示全部樓層 |閱讀模式
網絡程序設計實驗報告
一、實驗目的
1.熟悉UDP下socket編程,掌握socket編程的具體實現步驟
2.熟悉進程間通信方式,掌握常用IPC編程方法
3.熟悉并發(fā)服務器模型,掌握一種編程方法
二、實驗內容
1.用UDP套接字實現流式通信
2.用管道,套接字,共享內存實現一個大文件的傳輸并比較他們的速率
3.創(chuàng)建一個TCP并發(fā)服務,并可支持斷點續(xù)傳。
三、實驗步驟
1.用UDP套接字實現流式通信
基于UDP套接字的編程模型如下:              


0.png

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

2.用管道,套接字,文件共享實現一個大文件的傳輸
(1)管道可以用于具有親緣關系的進程間通信,命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系的進程之間通信。當進程創(chuàng)建一個管道的時候,系統內核同時為該進程設立了一對文件句柄,一個用來從管道獲取數據,另一個用來向管道輸出數據,如圖2-1。在主進程中利用fork()函數創(chuàng)建一個子進程,該子進程繼承了父進程打開的文件句柄,利用繼承的句柄,就可以實現父子進程之間的通信,如圖2-2。
現在,父子兩個進程同時擁有對同一個管道的讀寫句柄,因為管道必須是單向的,所以還需要決定數據的流動方向是從父進程到子進程還是從子進程到父進程,然后在每個進程中關閉不需要的句柄。假設需要利用管道完成從父進程向子進程傳送數據,關閉了相應句柄后的管道如圖2-3所示。

1.png

通過以上操作后,建立好像完整的管道數據通路,就可以利用標準的讀寫函數read()、write()對管道進行讀寫操作了。
在具體的C程序中,使用pipe()函數來建立管道。它只有一個參數:一個有兩個成員的整形數組,用于存放pipe()函數新建立的管道句柄。
(2)套接字是兩個通信通道上得端點。套接字函數可以用來產生通信信道,通過信道兩個應用程序間可以傳送數據。由于需要傳輸的是文件,所以選擇安全機制較高的TCP套接字。基于TCP套接字的編程模型如下:


0.png


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

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

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


image001.png
客戶端程序運行情況
image002.png
服務器端程序運行情況
image003.png
QT4開發(fā)環(huán)境
2.用管道,套接字,文件共享實現一個大文件的傳輸
image004.png
管道傳輸
image005.png
QT4開發(fā)環(huán)境
image006.png
套接字傳輸客戶端
image007.png
套接字傳輸服務器端
image008.png
QT4開發(fā)環(huán)境
image009.png
共享內存?zhèn)鬏敚ㄐ∥募?/font>
image010.png
共享內存?zhèn)鬏敚ù笪募?/font>
可以看出,除了用共享內存?zhèn)鬏敶笪募ㄟ@種情況下為何速度不高沒有弄清楚)這種情況。傳輸速度依次為:
管道:42 MB/s
套接字:47 MB/s
共享內存:300 MB/s
無疑,共享內存速度最快,按照理論管道應該比套接字速度快,但本實驗中發(fā)現套接字竟然比管道速度快,這個問題也沒有弄清楚。
image011.png
QT4卡開發(fā)環(huán)境
3.創(chuàng)建一個TCP并發(fā)服務,支持斷點續(xù)傳
image012.jpg
服務器端傳輸程序界面
image013.jpg
客戶端接收程序界面
五、實驗總結
通過本次課程設計,初步了解了Linux下的網絡程序設計的步驟,對基于套接字的編程有了個新的認識。Qt集成開發(fā)環(huán)境使Linux下的C/C++開發(fā)方便了許多,無論是代碼編寫還是調試運行。雖然沒有獨立完成最后一題,但也通過在嘗試自己編寫,自己閱讀開源的小型Ftp客戶端軟件,對Linux的Shell編程有了新的認識,尤其對如何利用標準C編寫跨平臺程序。總體通過這次作業(yè),收獲到了很多以前不了解或了解不深入的東西,對網絡程序設計有了新的認識。

下面是部分源碼,完整代碼請下載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. }
復制代碼
論文和程序下載:
0.png
網絡程序設計報告 源碼.rar (2.06 MB, 下載次數: 9)

回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产aⅴ中文 | 999久久久精品 | 黄在线 | 不卡一二区 | 日韩精品在线一区 | 一区二区三区视频在线观看 | av在线免费观看网址 | 国产二区av | 成人精品一区二区 | 91黄色片免费看 | 日韩国产在线 | 日韩欧美一区二区三区免费观看 | 中文字幕第一页在线 | 国产福利小视频 | 亚洲狠狠 | 欧美一区2区三区4区公司二百 | 九色 在线 | 手机看黄av免费网址 | 日韩在线播放视频 | 日本精品一区二区 | a中文在线视频 | 色婷婷亚洲一区二区三区 | 久久小视频 | 日韩精品视频在线播放 | 亚洲精品在线观看视频 | 亚洲第1页 | 成人国产精品久久久 | 91av视频 | 尤物视频在线免费观看 | 欧美另类视频在线 | 国产精品亚洲综合 | 日本爱爱视频 | 综合五月婷 | 免费看欧美一级片 | 久久久久国产精品 | 亚洲日本国产 | 欧美日韩成人 | 久久久免费电影 | 国产一区91精品张津瑜 | 成人av免费 | 亚洲国产一区在线 |