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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux网络编程 之 TCP编程(七)

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

目錄
1. TCP客戶端
- 核心函數
- 完整的TCP客戶端程序
2. TCP服務端
- 核心函數
- 完整的TCP客戶端程序


TCP編程的核心步驟和流程:

1. TCP客戶端

核心函數:

  • 創建一個套接字:
  • int socket(int family,int type,int protocol);
    • family: 套接字域
    • type: 套接字類型
    • protocol 套接字協議

    • 向服務器發送連接請求:
    int connect( int sockfd, const struct sockaddr *addr, socklen_t len );
    • sockfd:套接字描述符
    • addr: 連接的服務器地址結構
    • len: 地址結構體長度

    • 向服務器發送數據:
    ssize_t send(int sockfd, const void* buf, size_t nbytes,int flags);
    • sockfd: 已建立連接的套接字描述符
    • buf: 發送數據的地址
    • nbytes: 發送緩數據的大小(以字節為單位)
    • flags: 套接字標志(常為 0)

    完整的UDP客戶端程序

    #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]) {unsigned short port; // 服務器的端口號char *server_ip ; // 服務器ip地址if( argc > 1 ) //函數傳參 { server_ip = argv[1];} if( argc > 2 ) //函數傳參 {port = atoi(argv[2]);}int sockfd;sockfd = socket(AF_INET, SOCK_STREAM, 0);// 創建通信端點:套接字if(sockfd < 0){perror("socket");exit(-1);}// 設置服務器地址結構體struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr)); // 初始化服務器地址server_addr.sin_family = AF_INET; // IPv4server_addr.sin_port = htons(port); // 端口//inet_pton(AF_INET, server_ip, &server_addr.sin_addr); // ipserver_addr.sin_addr.s_addr = inet_addr(server_ip);//與inet_pton等價// 主動連接服務器int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(err_log != 0){perror("connect");close(sockfd);exit(-1);}printf("send data to %s:%d\n",server_ip,port);char send_buf[512] = "this is send data";printf("send data \"%s \" to %s:%d\n",send_buf,server_ip,port);send(sockfd, send_buf, strlen(send_buf), 0); // 向服務器發送信息char recv_buf[512] = {0};recv(sockfd, recv_buf, sizeof(send_buf), 0); // 接收數據printf("%s\n", recv_buf);close(sockfd);return 0; }

    2. TCP服務端

    核心函數:

  • 本地協議地址與 sockfd 綁定,這樣 ip、port 就固定了
  • int bind( int sockfd, const struct sockaddr *myaddr,socklen_t addrlen );
    • sockfd:socket 套接字
    • myaddr: 指向特定協議的地址結構指針
    • addrlen:該地址結構的長度

    • 將套接字由主動修改為被動,使操作系統為該套接字設置一個連接隊列
    int listen(int sockfd, int backlog);
    • sockfd: socket監聽套接字
    • backlog:連接隊列的長度

    • 如果沒有連接可用,則進入阻塞狀態,如果有連接可用則取出一個已經建立的連接
    int accept( int sockfd,struct sockaddr *cliaddr, socklen_t *addrlen );
    • sockfd: socket監聽套接字
    • cliaddr: 用于存放客戶端套接字地址結構
    • addrlen: 套接字地址結構體長度的地址

    完整的UDP服務端程序

    #include <stdio.h>#include <stdlib.h>#include <string.h> #include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h> int main(int argc, char *argv[]){unsigned short port = 8000; // 本地端口 if(argc > 1) {port = atoi(argv[1]);}//1.創建通信端點:套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0){perror("socket");exit(-1);}//設置本地地址結構體struct sockaddr_in my_addr;bzero(&my_addr, sizeof(my_addr)); // 清空,保證最后8字節為0 my_addr.sin_family = AF_INET; // ipv4my_addr.sin_port = htons(port); // 端口my_addr.sin_addr.s_addr = htonl(INADDR_ANY);// ip,INADDR_ANY為通配地址其值為0//2.綁定:將本地ip、端口與套接字socket相關聯起來int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if( err_log != 0){perror("binding");close(sockfd); exit(-1);}//3.監聽,監聽套接字改為被動,創建連接隊列err_log = listen(sockfd, 10); if(err_log != 0){perror("listen");close(sockfd); exit(-1);} printf("listen client @port=%d...\n",port);while(1){ struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = ""; socklen_t cliaddr_len = sizeof(client_addr); int connfd = 0;//4.從完成連接隊列中提取客戶端連接connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if(connfd < 0){perror("accept");continue;}inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("----------------------------------------------\n");printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));char recv_buf[512] = "";while( recv(connfd, recv_buf, sizeof(recv_buf), 0) > 0 ) // 接收數據{printf("\nrecv data:\n");printf("%s\n",recv_buf);}close(connfd); //關閉已連接套接字printf("client closed!\n");}close(sockfd); //關閉監聽套接字return 0;}

    總結

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

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