日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C : TCP/IP 和 网络编程

發布時間:2024/10/14 linux 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C : TCP/IP 和 网络编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、IP主機和IP地址

二、IP數據包格式

三、TCP/IP在網絡中的數據流

四、套接字編程

4.1 創建套接字

4.2綁定socket和端口號?

4.3、UDP 套接字

4.4 TCP 套接字

?五、 UDP回顯? 服務器-客戶機程序

六、TCP 回顯服務器-客戶機


?TCP/IP 是互聯網的基礎, TCP代表傳輸控制協議,IP代表互聯網協議。目前有兩個版本IP,一個是32位地址的IPv4 和一個是128位的 IPv6 。而IPv4 是現如今使用最多的IP版本,也是這次討論的重點。

一、IP主機和IP地址

? ? ? 每一個注意由一個32位的IP地址來標識。為了方便起見,通常用32位的IP低質號用記點法標識例如:134.121.64.1? 也可以用主機名標識如 dns1.eec.wsu.edu 。實際上應用程序通常使用主機名而不是IP地址。因為給定其中一個,我們都可以通過dns(域名系統)服務器找到另外一個,兩者之間可以相互轉換。

? ? ? IP地址分為兩部分 NeiworkID 和 HostID 字段。其中,IP 可以分為A~E類。例如B類IP分為一個16位NeiworkID,前兩位是10 。發往UP地址的數據包首先被發送到具有相同networkID的路由器默認IP地址位127.0.0.1.

二、IP數據包格式

IP數據包由IP頭、發送方IP地址、接收方IP地址和數據組成。每個IP數據包的大小最大為64K。IP頭包含有關數據包的信息。內容如下:? ?

?IP主機可能距離很遠通常不可能從一個主機直接向另一個主機發送數據包。路由器是轉發數據包的特殊IP主機,它可以向普通IP主機和其他路由器發送數據包,

三、TCP/IP在網絡中的數據流

?應用層的數據被傳到傳輸層會添加TCP 或者UDP包頭來標識使用的傳輸協議。合并后的數據被傳到IP網絡層,添加一個包含IP地址的IP報頭來標識發送和接收主機。然后合并后的數據傳遞到網絡鏈路層,再次將數據分成多個幀,添加發送和接收網絡的地址,用于在物理網絡之間的傳輸。

四、套接字編程

在 netdb.h 和 sys/socket.h中有套接字的地址結構定義

struct sockaddr_in {sa_family_t sin_family; //TCP/IP網絡的sin_family 始終設置為AF_INETin_port_t sin_port; //包含網絡字節順序排列的端口號struct in_addr sin_addr ; //按網絡字節順序排列的IP地址 }struct in_addr{ unit32_t s_addr; //按網絡字節順序排列的IP地址 }

服務器套接字編程步驟如下

  • 創建socket;
  • 綁定socket和端口號;
  • 監聽端口號;? ? ? ? ? ? ?(UDP省略)
  • 接收來自客戶端的連接請求;(UDP省略)
  • 從socket中讀取字符;
  • 發送消息回客戶機。
  • 客戶端套接字編程步驟如下

  • 創建socket;
  • 連接指定計算機的端口; (UDP省略)
  • 向socket中寫入信息;
  • 從服務器接收消息。
  • 4.1 創建套接字

    int socket(int domain, int type, int protocol); domain參數參數含義
    AF_INETIPv4協議
    AF_INET6Ipv6協議
    AF_LOCALUnix協議域/只在本機內通信的套接字
    AF_ROUTE路由套接字
    AF_KEY秘鑰套接字
    type參數參數含義
    SOCK_STREAM字節流套接字 (TCP)
    SOCK_DGRAM數據報套接字 (UDP)
    SOCK_SEQPACKET有序分組套接字
    SOCK_RAW原始套接字

    4.2綁定socket和端口號?

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    ?bind系統調用將addr指定的地址分配文件描述符 sockfd所引用的套接字,addrlen指定addr所指向地址結構的大小對于用于聯系其他UDP服務器主機的UDP套接字,必須綁定到客戶機地址,允許服務器發回應答。對于接收客戶機的TCP套接字,必須先將其綁定到服務器主機地址。

    4.3、UDP 套接字

    ? ?將緩沖區中len字節數據發送到dest_addr標識的目標主機

    ssize_t sendto(int fd, const void *buf,size_t len,int flags,const struct sockaddr *dest_addr,socklen_t tolen);

    ? ?從緩沖區中len字節數接收數據

    ssize_t recvfrom(int fd, void *buf, size_t len,int flags,struct sockaddr *src_addr, socklen_t *len);

    4.4 TCP 套接字

    ? 在綁定socket 和端口號后? TCP服務器用 listen 和 accpet 來監聽、接受客戶機的連接

    //backlog 定義了等待連接的最大長度 int listen(int sockfd, int backlog);//提取等待連接隊列上的第一個連接請求同于監聽sockfd,執行時造成進程阻塞,直到客戶機通過connect建立連接 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 返回新的文件描述符//如果sockfd 時SOCK_DGRAM (USD 套接字)類型時,addr時發送數據報的默認地址,也是接收數據報的唯一地址。如果時 SOCK_STREAM (TCP 套接字)類型時,connect連接到綁定到addr指定的套接字 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    發送/接收數據

    ? ? 可以使用? send/read? ?或者 recv/write? 來接收和發送數據。

    read 和 write? 是對文件描述符的讀取和寫入

    //對已經連接的fd 發送數據 ,flags 通常是0 ssize_t send(int fd , const void *buf , size_t len , int flags);//對已經連接的fd 接收數據 ,flags 通常是0 ssize_t recv(int fd , void *buf , size_t len , int flags);

    ?五、 UDP回顯? 服務器-客戶機程序

    ? ?服務器端:

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>#define BUFLEN 256 #define PORT 1234char line[BUFLEN]; struct sockaddr_in me ,client; int sock ,rlen=sizeof(client); socklen_t clen = sizeof (client);int main (){printf("1. create a UDP socket\n");sock = socket (AF_INET,SOCK_DGRAM,IPPROTO_UDP);printf("2. fill me with server address and port number \n");memset((char *) & me ,0,sizeof(me));me.sin_family = AF_INET;me.sin_port = htons(PORT);me.sin_addr.s_addr = htonl(INADDR_ANY);printf("3. bind socket to server IP and port \n");bind (sock ,(struct sockaddr *) & me ,sizeof (me));printf("4. wait for datagram \n");while (1){memset(line ,0,BUFLEN);printf("UDP server:waiting for datagram \n");rlen =recvfrom (sock , line , BUFLEN,0,(struct sockaddr *)&client ,&clen);printf("received a datagram from [host : prot] =[%s :%d] \n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));printf("rlen=%d:line%s \n",rlen,line);printf("send reply \n");sendto (sock ,line,rlen,0,(struct sockaddr*)&client,clen);printf("------------------------\n");}}

    UDP客戶機端

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>#define BUFLEN 256 #define SERVER_PORT 1234 #define SERVER_HOST "127.0.0.1" char line[BUFLEN]; struct sockaddr_in server; int sock ,rlen,slen = sizeof (server);int main (){printf("1. create a UDP socket\n");sock = socket (AF_INET,SOCK_DGRAM,IPPROTO_UDP);printf("2. fill in server address and port number \n");memset((char *) & server ,0,sizeif(server));server.sin_family = AF_INET;server.sin_port = htons(SERVER_PORT);inet_aton(SERVER_PORT , &server.sin_addr);while(1){printf("Enter a line: \n"); fget(line,BUFLEN,stdin);line[strlen(line) -1 ]=0;printf("send a line to server \n");sendto(sock,line,strlen(len),0,(struct sockaddr *)&server,slen);memset(line ,0 ,BUFLEN);printf("try to receive a line from server \n");rlen =recvfrom (sock,line,BUFLEN,0,(struct sockaddr *)&server,slen);printf("rlen =%d : line=%s \n" ,rlen ,line);}}

    ?

    六、TCP 回顯服務器-客戶機

    服務器端

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include<unistd.h> #define MAX 256 #define SERVER_IP "127.0.0.1" #define SERVER_HOST "localhost" #define SERVER_PORT 1234struct sockaddr_in server_addr ,client_addr; int mysock,csock; //sock的文件描述符 int r,n; //輔助變量 socklen_t len; int server_init(){printf("=============server init========\n");printf("1. create a TCP socket\n");mysock = socket (AF_INET,SOCK_STREAM,0);if(mysock < 0){printf("socket call failed\n"); exit(1);}printf("2. fill server_addr with host_ip and port number \n");server_addr .sin_family = AF_INET;server_addr .sin_port = htons(SERVER_PORT);server_addr .sin_addr.s_addr = htonl(INADDR_ANY);printf("3. bind socket to server address \n");r =bind (mysock ,(struct sockaddr *) & server_addr ,sizeof (server_addr ));if( r<0){printf("bind call failed\n"); exit(3);}printf(" hostname =%s, port = %d \n", SERVER_HOST ,SERVER_PORT);listen(mysock , 5 );printf("============init done ===========\n");return 0; }int main (){char line [MAX];server_init();while (1){printf("server accepting new connection... \n");len = sizeof(client_addr);csock = accept(mysock,(struct sockaddr *)&client_addr,&len); if(csock <0){printf("accept failed\n"); exit(1);}printf("Server: accept a client :IP=%s , port = %d \n",inet_ntoa(client_addr.sin_addr) ,ntohs(client_addr.sin_port)); while(1){n=read(csock,line,MAX);if(n=0) {printf("clinet dead ,server loop\n");close(csock); break;}printf("read n =%d byte;line = %s \n", n,line);n=write(csock,line,MAX);printf("write n =%d byte;ECHO = %s \n", n,line);printf("ready for next request\n");}}}

    ?客戶端:

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include<unistd.h>#define MAX 256 #define SERVER_HOST "localhost" #define SERVER_PORT 1234struct sockaddr_in server_addr ; int sock,r; int client_init(){printf("=============client init========\n");printf("1. create a TCP socket\n");sock = socket (AF_INET,SOCK_STREAM,0);if(sock < 0){printf("socket call failed\n"); exit(1);}printf("2. fill server_addr with host_ip and port number \n");server_addr .sin_family = AF_INET;server_addr .sin_port = htons(SERVER_PORT);server_addr .sin_addr.s_addr = htonl(INADDR_ANY);printf("3. connecting to server \n");r = connect (sock ,(struct sockaddr *) & server_addr ,sizeof (server_addr )); if( r<0){printf("bind call failed\n"); exit(3);}printf(" hostname =%s, port = %d \n", SERVER_HOST ,SERVER_PORT);printf("============client init done ===========\n");return 0; }int main (){char line [MAX] , ans[MAX];int n; client_init();printf(" ********processing loop *******************");while (1){printf("put a line... \n");bzero(line ,MAX);fgets(line,MAX,stdin);line[strlen(line) - 1] = 0;if(line[0] ==0) exit(0);n=write(sock,line,MAX);printf("client : wrote n =%d bytes ; line %s :\n", n , line);n =read(sock ,ans,MAX); printf("client : read n =%d bytes ; line %s :\n", n , line);}}

    總結

    以上是生活随笔為你收集整理的Linux C : TCP/IP 和 网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 91在线观看成人 | 亚洲天堂一区二区 | 亚洲字幕成人中文在线观看 | 欧美乱大交xxxxx潮喷l头像 | 午夜激情视频网站 | 国产夜色精品一区二区av | 亚洲一级二级 | 在线天堂网 | 亚洲最新在线 | 中文字幕在线视频免费观看 | 久久99国产视频 | 天天久久综合网 | caoprom在线 | 91精品人妻一区二区 | 亚洲欧美视频二区 | 成人黄色在线视频 | 亚洲熟妇无码一区二区三区导航 | 午夜在线看| 香蕉黄色网 | 日韩人妻一区二区三区蜜桃 | 精品成人免费视频 | 涩涩小网站 | 岛国av在线免费观看 | 欧美片17c07.com | 91综合网| 中文字幕av一区二区三区谷原希美 | 中文字幕午夜 | 中文字幕在线官网 | 特黄特色大片免费播放器使用方法 | 欧美xxxxxx片免费播放软件 | ts人妖另类精品视频系列 | 特黄aaaaaaaaa毛片免 | 久草影音 | 精品在线免费播放 | 日韩欧美黄 | 一区二区三区在线免费视频 | 色操插| 手机看片日韩欧美 | 日韩一级片网站 | 久久久久夜夜夜精品国产 | 特级丰满少妇一级aaaa爱毛片 | 午夜影院欧美 | 久久精品视频久久 | 国产熟女一区二区丰满 | 日韩一区二区在线观看视频 | 美女国产一区 | 久久精品性爱视频 | 国产成人高清视频 | 婷婷天天| 亚洲欧美在线看 | 久久综合在线 | 在线永久看片免费的视频 | 鲁一鲁啪一啪 | 日韩欧美成人一区二区三区 | 中文字幕一区二区三区波野结 | 日韩毛片无码永久免费看 | 美国黄色一级毛片 | 国产精华一区二区三区 | 亚洲免费在线视频观看 | 国产精品一区av | 岛国大片在线免费观看 | 麻豆福利视频 | 美日韩精品| 成人午夜看片 | 成人午夜视频在线免费观看 | 欧美日韩成人在线 | 久久影院一区 | xxxx视频在线观看 | 超碰福利在线观看 | 亚洲午夜在线播放 | 国产成人三级在线观看 | 亚洲一级二级片 | 国产又黄又硬又粗 | 美女久久久| 亚洲视频在线观看网站 | 日韩欧美色图 | 91精品视频在线 | 777在线视频 | 男女性生活视频网站 | 亚洲成色| 国产性xxx| 国产精品成人免费一区久久羞羞 | 亚洲天堂男人网 | 国产成人主播 | 国产精品看片 | 无码日韩人妻精品久久蜜桃 | 欧美精品四区 | 国产精品美女久久久免费 | 精品小视频在线观看 | 欧美乱码精品 | wwwxxx黄色| 人妻夜夜爽天天爽三区麻豆av网站 | 国产高清露脸 | 欧美一级片免费看 | 国产精品无码久久久久成人app | 欧美成人资源 | 欧类av怡春院 | 91精品视频免费看 | 成年人高清视频 |