Linux网络编程 之 TCP编程(七)
生活随笔
收集整理的這篇文章主要介紹了
Linux网络编程 之 TCP编程(七)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1. TCP客戶端
- 核心函數
- 完整的TCP客戶端程序
2. TCP服務端
- 核心函數
- 完整的TCP客戶端程序
TCP編程的核心步驟和流程:
1. TCP客戶端
核心函數:
- family: 套接字域
- type: 套接字類型
protocol 套接字協議
- 向服務器發送連接請求:
- sockfd:套接字描述符
- addr: 連接的服務器地址結構
len: 地址結構體長度
- 向服務器發送數據:
- 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:socket 套接字
- myaddr: 指向特定協議的地址結構指針
addrlen:該地址結構的長度
- 將套接字由主動修改為被動,使操作系統為該套接字設置一個連接隊列
- sockfd: socket監聽套接字
backlog:連接隊列的長度
- 如果沒有連接可用,則進入阻塞狀態,如果有連接可用則取出一個已經建立的連接
- 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编程(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络编程 之 UDP编程(六)
- 下一篇: Linux网络编程 之 IO多路复用se