青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tqsheng

go.....
隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
數據加載中……

TCP服務器端和客戶端程序設計

 


二、實驗平臺

Linux操作系統

三、實驗內容

編寫Linux下TCP服務器套接字程序,程序運行時服務器等待客戶的連接,一旦連接成功,則顯示客戶的IP地址、端口號,并向客戶端發送字符串。

四、實驗原理

使用TCP套接字編程可以實現基于TCP/IP協議的面向連接的通信,它分為服務器端和客戶端兩部分,其主要實現過程如圖1.1所示。

                                           


    圖1.1 TCP客戶/服務器的套接字函數


1、socket函數:為了執行網絡輸入輸出,一個進程必須做的第一件事就是調用socket函數獲得一個文件描述符。

-----------------------------------------------------------------
 #include <sys/socket.h>
 int socket(int family,int type,int protocol);    
      返回:非負描述字---成功   -1---失敗
 -----------------------------------------------------------------

  第一個參數指明了協議簇,目前支持5種協議簇,最常用的有AF_INET(IPv4協議)和AF_INET6(IPv6協議);第二個參數指明套接口類型,有三種類型可選:SOCK_STREAM(字節流套接口)、SOCK_DGRAM(數據報套接口)和SOCK_RAW(原始套接口);如果套接口類型不是原始套接口,那么第三個參數就為0。

2、connect函數:當用socket建立了套接口后,可以調用connect為這個套接字指明遠程端的地址;如果是字節流套接口,connect就使用三次握手建立一個連接;如果是數據報套接口,connect僅指明遠程端地址,而不向它發送任何數據。

-----------------------------------------------------------------
 #include <sys/socket.h>      
  int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);  
           返回:0---成功   -1---失敗
 -----------------------------------------------------------------

  第一個參數是socket函數返回的套接口描述字;第二和第三個參數分別是一個指向套接口地址結構的指針和該結構的大小。

這些地址結構的名字均已“sockaddr_”開頭,并以對應每個協議族的唯一后綴結束。以IPv4套接口地址結構為例,它以“sockaddr_in”命名,定義在頭文件<netinet/in.h>;以下是結構體的內容:

 

------------------------------------------------------------------
struct in_addr {
 in_addr_t s_addr;     /* IPv4地址 */
}; 
struct sockaddr_in {
 uint8_t sin_len; /* 無符號的8位整數 */
 sa_family_t sin_family;
 /* 套接口地址結構的地址簇,這里為AF_INET */
 in_port_t sin_port; /* TCP或UDP端口 */
 struct in_addr sin_addr;
 char sin_zero[8];  

};
     -------------------------------------------------------------------

3、bind函數:為套接口分配一個本地IP和協議端口,對于網際協議,協議地址是32位IPv4地址或128位IPv6地址與16位的TCP或UDP端口號的組合;如指定端口為0,調用bind時內核將選擇一個臨時端口,如果指定一個通配IP地址,則要等到建立連接后內核才選擇一個本地IP地址。

-------------------------------------------------------------------
#include <sys/socket.h>  
 int bind(int sockfd, const struct sockaddr * server, socklen_t addrlen);
 返回:0---成功   -1---失敗 
 -------------------------------------------------------------------

  第一個參數是socket函數返回的套接口描述字;第二和第第三個參數分別是一個指向特定于協議的地址結構的指針和該地址結構的長度。

4、listen函數:listen函數僅被TCP服務器調用,它的作用是將用sock創建的主動套接口轉換成被動套接口,并等待來自客戶端的連接請求。

-------------------------------------------------------------------
#include <sys/socket.h>
 int listen(int sockfd,int backlog);   
 返回:0---成功   -1---失敗
 -------------------------------------------------------------------

  第一個參數是socket函數返回的套接口描述字;第二個參數規定了內核為此套接口排隊的最大連接個數。由于listen函數第二個參數的原因,內核要維護兩個隊列:以完成連接隊列和未完成連接隊列。未完成隊列中存放的是TCP連接的三路握手為完成的連接,accept函數是從以連接隊列中取連接返回給進程;當以連接隊列為空時,進程將進入睡眠狀態。

5、accept函數:accept函數由TCP服務器調用,從已完成連接隊列頭返回一個已完成連接,如果完成連接隊列為空,則進程進入睡眠狀態。

-------------------------------------------------------------------
#include <sys/socket.h>         
 int accept(int listenfd, struct sockaddr *client, socklen_t * addrlen);  
  回:非負描述字---成功   -1---失敗
 -------------------------------------------------------------------

第一個參數是socket函數返回的套接口描述字;第二個和第三個參數分別是一個指向連接方的套接口地址結構和該地址結構的長度;該函數返回的是一個全新的套接口描述字;如果對客戶段的信息不感興趣,可以將第二和第三個參數置為空。

6、write和read函數:當服務器和客戶端的連接建立起來后,就可以進行數據傳輸了,服務器和客戶端用各自的套接字描述符進行讀/寫操作。因為套接字描述符也是一種文件描述符,所以可以用文件讀/寫函數write()和read()進行接收和發送操作。

(1)write()函數用于數據的發送。

-------------------------------------------------------------------
#include <unistd.h>         
 int write(int sockfd, char *buf, int len); 
  回:非負---成功   -1---失敗
 -------------------------------------------------------------------

參數sockfd是套接字描述符,對于服務器是accept()函數返回的已連接套接字描述符,對于客戶端是調用socket()函數返回的套接字描述符;參數buf是指向一個用于發送信息的數據緩沖區;len指明傳送數據緩沖區的大小。

 

(2)read()函數用于數據的接收。

-------------------------------------------------------------------
#include <unistd.h>         
 int read(int sockfd, char *buf, intlen);  
  回:非負---成功   -1---失敗
 -------------------------------------------------------------------

參數sockfd是套接字描述符,對于服務器是accept()函數返回的已連接套接字描述符,對于客戶端是調用socket()函數返回的套接字描述符;參數buf是指向一個用于接收信息的數據緩沖區;len指明接收數據緩沖區的大小。

7、send和recv函數:TCP套接字提供了send()和recv()函數,用來發送和接收操作。這兩個函數與write()和read()函數很相似,只是多了一個附加的參數。

(1)send()函數用于數據的發送。

-------------------------------------------------------------------
#include <sys/types.h>
#include < sys/socket.h >         
ssize_t send(int sockfd, const void *buf, size_t len, int flags);  
  回:返回寫出的字節數---成功   -1---失敗
 -------------------------------------------------------------------

前3個參數與write()相同,參數flags是傳輸控制標志。

(2)recv()函數用于數據的發送。

-------------------------------------------------------------------
#include <sys/types.h>
#include < sys/socket.h >         
ssize_t recv(int sockfd, void *buf, size_t len, int flags);  
  回:返回讀入的字節數---成功   -1---失敗
 -------------------------------------------------------------------

前3個參數與read()相同,參數flags是傳輸控制標志。

 

五、實驗步驟

1、登陸進入ubuntu操作系統,新建一個文件,命名為tcpserver.c(為了方便起見,可以進入“home”,再進入用戶目錄,在用戶目錄下新建tcpserver.c)。

2、在tcpserver.c中編寫服務器端程序代碼并保存。

3、在“終端”(“Applications”→“附件”→“終端”)中執行命令進入tcpserver.c所在目錄。(pwd命令可以顯示當前所在目錄;ls命令可以顯示當前目錄下的文件和文件夾信息;cd..命令可以進入上一級目錄;cd 目錄名 命令可以進入當前所示的某個目錄。)

4、執行命令gcc –o tcpserver tcpserver.c生成可執行文件tcpserver。

5、執行命令./ tcpserver,觀察結果。

6、認真分析源代碼,體會如何編寫一個TCP服務器端程序。

六、參考程序(tcpserver.c

    

  1. #include <stdio.h>  
  2.        #include <stdlib.h>  
  3.        #include <string.h>  
  4.        #include <unistd.h>  
  5.        #include <sys/types.h>  
  6.        #include <sys/socket.h>  
  7.        #include <netinet/in.h>  
  8.        #include <arpa/inet.h>  
  9.        
  10.        #define  PORT 1234  
  11.        #define  BACKLOG 1  
  12.    
  13.        int main()  
  14.        {  
  15.        int  listenfd, connectfd;  
  16.        struct  sockaddr_in server;  
  17.        struct  sockaddr_in client;  
  18.        socklen_t  addrlen;  
  19.        if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)  
  20.        {  
  21.        perror("Creating  socket failed.");  
  22.        exit(1);  
  23.        }  
  24.        int opt =SO_REUSEADDR;  
  25.        setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
  26.        bzero(&server,sizeof(server));  
  27.        server.sin_family=AF_INET;  
  28.        server.sin_port=htons(PORT);  
  29.        server.sin_addr.s_addr= htonl (INADDR_ANY);  
  30.        if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1) {  
  31.        perror("Binderror.");  
  32.        exit(1);  
  33.        }     
  34.        if(listen(listenfd,BACKLOG)== -1){  /* calls listen() */  
  35.        perror("listen()error\n");  
  36.        exit(1);  
  37.        }  
  38.        addrlen =sizeof(client);  
  39.        if((connectfd = accept(listenfd,(struct sockaddr*)&client,&addrlen))==-1) {  
  40.        perror("accept()error\n");  
  41.        exit(1);  
  42.        }  
  43.        printf("Yougot a connection from cient's ip is %s, prot is %d\n",inet_ntoa(client.sin_addr),htons(client.sin_port));  
  44.        send(connectfd,"Welcometo my server.\n",22,0);  
  45.        close(connectfd);  
  46.        close(listenfd);  
  47. return 0;  
  48.        }  

實驗二 TCP客戶端程序設計

 

一、實驗目的

學習和掌握Linux下的TCP客戶端基本原理和基本編程方法。

二、實驗平臺

Linux操作系統

三、實驗內容

編寫Linux下TCP客戶端套接字程序,結合實驗一的服務器端程序,實現以下功能:

1、客戶根據用戶提供的IP地址連接到相應的服務器;

2、服務器等待客戶的連接,一旦連接成功,則顯示客戶的IP地址、端口號,并向客戶端發送字符串;

3、客戶接收服務器發送的信息并顯示。

四、實驗原理

見實驗一的實驗原理部分。

五、實驗步驟

1、登陸進入ubuntu操作系統,新建一個文件,命名為tcpclient.c(為了方便起見,可以進入“home”,再進入用戶目錄,在用戶目錄下新建tcpclient.c)。

2、在tcpclient.c中編寫客戶端程序代碼并保存。將實驗一完成的tcpserver.c拷貝到與tcpclient.c同一目錄下。

3、在“終端”(“Applications”→“附件”→“終端”)中執行命令進入tcpserver.c和tcpclient.c所在目錄。

4、執行命令gcc –o tcpserver tcpserver.c生成可執行文件tcpserver。

5、執行命令./ tcpserver。

6、再開一個“終端”,進入tcpserver.c和tcpclient.c所在目錄,執行命令

gcc–o tcpclient tcpclient.c生成可執行文件tcpclient。

7、執行命令./ tcpclient 127.0.0.1。

8、觀察兩個“終端”出現的結果。

9、認真分析源代碼,體會如何編寫一個TCP客戶端程序。

 

六、參考程序(tcpclient.c

       

  1. #include<stdio.h>  
  2.        #include <stdlib.h>  
  3.        #include<unistd.h>  
  4.        #include<string.h>  
  5.        #include<sys/types.h>  
  6.        #include<sys/socket.h>  
  7.        #include<netinet/in.h>  
  8.        #include<netdb.h>  
  9.    
  10.        #define  PORT 1234  
  11.        #define  MAXDATASIZE 100  
  12.    
  13.        int main(int argc, char *argv[])  
  14.        {  
  15.        int  sockfd, num;  
  16.        char  buf[MAXDATASIZE];  
  17.        struct hostent *he;  
  18.        struct sockaddr_in server;  
  19.        if (argc!=2) {  
  20.        printf("Usage:%s <IP Address>\n",argv[0]);  
  21.        exit(1);  
  22.        }  
  23.        if((he=gethostbyname(argv[1]))==NULL){  
  24.        printf("gethostbyname()error\n");  
  25.        exit(1);  
  26.        }  
  27.        if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1){  
  28.        printf("socket()error\n");  
  29.        exit(1);  
  30.        }  
  31.        bzero(&server,sizeof(server));  
  32.        server.sin_family= AF_INET;  
  33.        server.sin_port = htons(PORT);  
  34.        server.sin_addr =*((struct in_addr *)he->h_addr);  
  35.        if(connect(sockfd,(struct sockaddr *)&server,sizeof(server))==-1){  
  36.        printf("connect()error\n");  
  37.        exit(1);  
  38.        }  
  39.        if((num=recv(sockfd,buf,MAXDATASIZE,0)) == -1){  
  40.        printf("recv() error\n");  
  41.        exit(1);  
  42.        }  
  43.        buf[num-1]='\0';  
  44.        printf("Server Message: %s\n",buf);  
  45.        close(sockfd);  
  46. return 0;  
  47. }  
  48.       

 

實驗結果:



posted on 2012-07-05 14:27 tqsheng 閱讀(455) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品综合久久久| 久久免费99精品久久久久久| 欧美高清视频www夜色资源网| 亚洲一区二区三区免费视频| 日韩一级在线| 亚洲精品久久久久久久久久久| 免费中文字幕日韩欧美| 奶水喷射视频一区| 欧美国产日韩一区二区在线观看| 欧美成人免费网| 欧美激情久久久久| 日韩午夜黄色| 性做久久久久久免费观看欧美 | 国产一区导航| 国内外成人免费激情在线视频| 精品电影在线观看| 亚洲精品综合久久中文字幕| 亚洲免费电影在线观看| 亚洲午夜精品一区二区| 欧美在线3区| 欧美成人xxx| 一本久道久久综合中文字幕| 亚洲综合二区| 久久夜色精品国产欧美乱| 欧美精品三级| 国产精品天天摸av网| 国内激情久久| 亚洲一区二区三区免费观看| 久久综合色8888| 在线天堂一区av电影| 欧美伊人影院| 欧美日韩美女在线| 在线播放不卡| 亚洲一区二区在线| 你懂的网址国产 欧美| 亚洲最新中文字幕| 另类春色校园亚洲| 国产精品手机视频| 99国产欧美久久久精品| 久久av免费一区| 99热在这里有精品免费| 美国成人毛片| 在线观看欧美日本| 欧美午夜电影一区| 在线播放日韩专区| 欧美一级淫片aaaaaaa视频| 欧美激情第8页| 香蕉亚洲视频| 欧美午夜一区二区三区免费大片| 在线看片欧美| 久久天堂成人| 亚洲欧美精品在线观看| 欧美色图一区二区三区| 日韩视频免费在线| 欧美激情一区二区三区全黄| 欧美在线国产精品| 国产精品永久在线| 亚洲视频网站在线观看| 亚洲激情专区| 欧美精品激情blacked18| 亚洲欧洲在线观看| 欧美激情二区三区| 麻豆freexxxx性91精品| 亚洲国产一区在线| 欧美成人精品福利| 久久亚洲一区二区三区四区| 国语对白精品一区二区| 久久久久在线观看| 久久精品91久久久久久再现| 国产午夜亚洲精品羞羞网站| 欧美在线一级va免费观看| 亚洲一区二区三区免费观看 | 国产一区二区三区久久悠悠色av| 欧美一区二区在线看| 亚洲视频碰碰| 国产精品私房写真福利视频| 亚洲欧美日韩人成在线播放| 亚洲一区免费观看| 国内一区二区在线视频观看| 老鸭窝毛片一区二区三区| 久久亚洲免费| 99国产一区| 亚洲午夜av在线| 国产欧美在线播放| 久久尤物视频| 欧美国产日韩一区二区| 亚洲伊人第一页| 亚洲欧美日韩精品综合在线观看| 国产在线精品一区二区中文| 亚洲国产成人av| 欧美日韩免费一区二区三区| 午夜免费久久久久| 久久精品在线| 一本一本久久a久久精品牛牛影视| 99在线精品观看| 国产欧美日韩高清| 免费毛片一区二区三区久久久| 欧美国产精品久久| 午夜精品一区二区三区电影天堂 | 亚洲中字在线| 欧美国产第二页| 欧美高清视频| 亚洲一区日韩在线| 久久久久久久久综合| 99re66热这里只有精品4| 亚洲一区黄色| 亚洲精选成人| 性久久久久久| 一本高清dvd不卡在线观看| 亚洲欧美一级二级三级| 亚洲精选视频免费看| 午夜精品视频网站| 日韩一级精品| 欧美一区亚洲二区| 制服丝袜亚洲播放| 久久亚洲综合色| 午夜亚洲影视| 欧美精品1区2区| 久久综合中文| 国产欧美69| 亚洲视频欧美视频| 99这里只有久久精品视频| 久久激情视频久久| 亚洲欧美在线看| 欧美精品一区二区三区在线看午夜 | 久久综合一区| 欧美一区=区| 欧美日韩少妇| 欧美激情欧美狂野欧美精品| 国产亚洲精品一区二区| 一区二区三区精品视频| 亚洲美女诱惑| 女生裸体视频一区二区三区| 久久精品国产91精品亚洲| 国产精品成av人在线视午夜片| 最新中文字幕一区二区三区| 永久域名在线精品| 久久福利一区| 久久久爽爽爽美女图片| 国产日韩欧美在线看| 亚洲性色视频| 午夜精品视频在线| 国产精品青草综合久久久久99| 亚洲美女免费精品视频在线观看| 亚洲人成在线播放网站岛国| 美国十次成人| 亚洲国产精品久久久久秋霞不卡 | 在线播放中文字幕一区| 久久精品72免费观看| 老司机aⅴ在线精品导航| 红桃视频成人| 久久夜色精品国产噜噜av| 男女视频一区二区| 亚洲高清激情| 欧美日韩在线一区二区三区| 欧美激情久久久| 亚洲免费福利视频| 欧美精品久久99久久在免费线| 亚洲国产精品成人va在线观看| 亚洲精品欧美日韩专区| 欧美日韩1区2区3区| 99精品国产99久久久久久福利| 亚洲免费综合| 国产欧美日韩亚州综合| 久久久高清一区二区三区| 欧美高清你懂得| 亚洲视频axxx| 国产欧美日韩亚州综合| 久久嫩草精品久久久精品| 亚洲第一视频网站| 午夜免费电影一区在线观看| 在线看日韩av| 欧美亚洲成人精品| 久久久久免费观看| 一本色道久久综合亚洲精品高清 | 影音先锋亚洲一区| 欧美精选午夜久久久乱码6080| 亚洲一二三区在线| 欧美韩国日本综合| 香蕉久久久久久久av网站| 在线观看三级视频欧美| 欧美国产视频一区二区| 午夜在线不卡| 亚洲狼人综合| 欧美wwwwww| 午夜精品久久久| 亚洲第一综合天堂另类专| 欧美少妇一区二区| 牛人盗摄一区二区三区视频| 亚洲一区视频在线观看视频| 亚洲高清资源| 久久精品国产在热久久| 一区二区三区欧美激情| 一区三区视频| 国产热re99久久6国产精品| 欧美激情区在线播放| 久久精品国产亚洲一区二区三区 | 久久不射网站| 亚洲视频第一页| 亚洲国产精品一区制服丝袜|