国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

TCP實現(xiàn)服務(wù)器和客戶端通信

這篇具有很好參考價值的文章主要介紹了TCP實現(xiàn)服務(wù)器和客戶端通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

TCP介紹

代碼實現(xiàn)

server(服務(wù)器端)

代碼分析

client(客戶端)

代碼分析

結(jié)果展示


TCP介紹

TCP (Transmission Control Protocol) 是一種面向連接的協(xié)議,用于在計算機(jī)網(wǎng)絡(luò)中傳輸數(shù)據(jù)。TCP 可以確保數(shù)據(jù)的可靠傳輸,即使在網(wǎng)絡(luò)環(huán)境不穩(wěn)定的情況下也能夠保證數(shù)據(jù)的完整性和順序。以下是 TCP 通信的一些特點:

  1. 面向連接:在 TCP 通信中,通信的雙方必須先建立一個連接,然后才能進(jìn)行數(shù)據(jù)的傳輸。連接的建立需要經(jīng)過三次握手過程,確保雙方都能夠進(jìn)行通信。
  2. 可靠傳輸:TCP 可以保證數(shù)據(jù)的可靠傳輸,它使用確認(rèn)和重傳機(jī)制來確保數(shù)據(jù)的完整性和順序。每當(dāng)發(fā)送方發(fā)送數(shù)據(jù)包時,接收方都會發(fā)送一個確認(rèn)信息來表示已經(jīng)收到數(shù)據(jù)。如果發(fā)送方?jīng)]有收到確認(rèn)信息,它會重新發(fā)送數(shù)據(jù),直到接收方確認(rèn)為止。
  3. 流量控制:TCP 可以根據(jù)接收方的處理能力來控制數(shù)據(jù)的發(fā)送速度,防止發(fā)送方發(fā)送過多的數(shù)據(jù)導(dǎo)致接收方無法處理。
  4. 擁塞控制:TCP 可以根據(jù)網(wǎng)絡(luò)狀況來調(diào)整發(fā)送方的數(shù)據(jù)發(fā)送速度,防止網(wǎng)絡(luò)擁塞導(dǎo)致數(shù)據(jù)丟失和傳輸延遲。

總之,TCP 是一種可靠的協(xié)議,它在網(wǎng)絡(luò)傳輸中發(fā)揮了重要的作用,特別是在需要確保數(shù)據(jù)完整性和順序的場合,如 Web 瀏覽器、電子郵件、文件傳輸?shù)葢?yīng)用中。

代碼實現(xiàn)

server(服務(wù)器端)

/server*****/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
//1.使用socket函數(shù)-創(chuàng)建流式套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //創(chuàng)建IPv4的TCP套接字
if (sockfd < 0)
{
perror("scoket err");
return -1;
}
//socket第一個參數(shù)已經(jīng)是AF_INET ipv4,是用bind函數(shù)得填充ipv4結(jié)構(gòu)體
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; //設(shè)置地址族為IPv4
saddr.sin_port = htons(atoi(argv[1])); //端口占了兩個字節(jié),將小端轉(zhuǎn)換為大端
saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); //綁定任意可用的IP地址

//2.綁定套接字,ip和端口
if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
{
    perror("bind");
    return -1;
}
else
{
    printf("bind ok\n");
}

//3.監(jiān)聽-被動狀態(tài)
if (listen(sockfd, 5) < 0) //設(shè)置監(jiān)聽隊列大小為5
{
    perror("listen err");
    return -1;
}

//4.阻塞等待客戶端鏈接
int accept_fd = accept(sockfd, NULL, NULL); //接受客戶端的連接請求
if (accept_fd < 0)
{
    perror("accept err");
    return -1;
}

//5.循環(huán)接受消息
char arr[128];
ssize_t ret;
while (1)
{
    ret = recv(accept_fd, arr, sizeof(arr), 0); //從客戶端接收數(shù)據(jù)
    if (ret < 0)
    {
        perror("recv err");
        return -1;
    }
    else if (ret == 0)
    {
        perror("clien exit");
        break;
    }
    else
    {
        write(1, arr, ret); //將接收到的數(shù)據(jù)輸出到終端
    }
}

close(sockfd); //關(guān)閉套接字
close(accept_fd);

return 0;
}

代碼分析

具體分析如下:

第1行到第15行,定義了程序的主函數(shù)main(),并進(jìn)行了如下操作:
使用socket函數(shù)創(chuàng)建一個IPv4的TCP套接字。
利用bind函數(shù)將套接字綁定到指定IP和端口上。
使用listen函數(shù)將套接字設(shè)置為監(jiān)聽狀態(tài),設(shè)置了監(jiān)聽隊列的長度為5。
使用accept函數(shù)等待客戶端連接請求,并返回連接套接字的文件描述符。
在一個while循環(huán)中循環(huán)接收客戶端發(fā)送的消息,然后將接收到的消息輸出到終端。
關(guān)閉套接字。
第17行到第22行,定義了一個IPv4的套接字地址結(jié)構(gòu)體sockaddr_in,并設(shè)置IP地址和端口號。

第24行到第32行,利用bind函數(shù)將套接字綁定到指定IP和端口上,并檢查綁定是否成功。

第35行到第41行,使用listen函數(shù)將套接字設(shè)置為監(jiān)聽狀態(tài),并設(shè)置監(jiān)聽隊列的長度為5,如果監(jiān)聽失敗則輸出錯誤信息并退出程序。

第44行到第50行,使用accept函數(shù)阻塞等待客戶端連接請求,如果接受失敗則輸出錯誤信息并退出程序,否則返回連接套接字的文件描述符。

第53行到第64行,在一個while循環(huán)中循環(huán)接收客戶端發(fā)送的消息,如果接收失敗則輸出錯誤信息并退出程序,如果接收到的消息長度為0則說明客戶端已經(jīng)關(guān)閉連接,退出循環(huán);否則將接收到的消息輸出到終端。

第67行到第70行,關(guān)閉套接字并退出程序。

該程序?qū)崿F(xiàn)了一個簡單的TCP服務(wù)器,可以接收客戶端的連接并循環(huán)接收客戶端發(fā)送的消息,將接收到的消息輸出到終端。

client(客戶端)

/client**********/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
//1. 使用socket創(chuàng)建流式套接子
int socket_fd;
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd < 0)
{
perror("socket_fd err"); // 打印錯誤信息
return -1;
}

//2. 請求鏈接
struct sockaddr_in cnt;
cnt.sin_family = AF_INET;
cnt.sin_port = htons(atoi(argv[1])); // 將輸入的字符串參數(shù)轉(zhuǎn)換為整數(shù)端口號
cnt.sin_addr.s_addr = inet_addr("0.0.0.0"); // 設(shè)置服務(wù)器的IP地址
if (connect(socket_fd, (struct sockaddr *)&cnt, sizeof(cnt)) < 0)
{
    perror("connect err"); // 打印錯誤信息
    return -1;
}

char buf[128];
int ch;
while (1)
{
    ch = read(0, buf, 128); // 從標(biāo)準(zhǔn)輸入讀取用戶輸入的數(shù)據(jù)
    if (send(socket_fd, buf, ch, 0) < 0) // 發(fā)送數(shù)據(jù)到服務(wù)器
    {
        perror("send err"); // 打印錯誤信息
        return -1;
    }
}

close(socket_fd); // 關(guān)閉套接字
return 0;
}

代碼分析

這是一個TCP客戶端代碼,它的主要功能是連接到指定的服務(wù)器并發(fā)送數(shù)據(jù)。下面是代碼的逐行分析:

socket_fd = socket(AF_INET, SOCK_STREAM, 0);:創(chuàng)建一個流式套接字。

cnt.sin_family = AF_INET;:設(shè)置服務(wù)器地址的協(xié)議族為IPv4。

cnt.sin_port = htons(atoi(argv[1]));:將從命令行參數(shù)獲取的字符串端口號轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序的整數(shù)端口號,并將其存儲在 sockaddr_in 結(jié)構(gòu)體的 sin_port 字段中。

cnt.sin_addr.s_addr = inet_addr("0.0.0.0");:設(shè)置服務(wù)器IP地址為 0.0.0.0,表示客戶端可以連接到任何一個可用的IP地址。

connect(socket_fd, (struct sockaddr *)&cnt, sizeof(cnt)):連接到服務(wù)器。這個函數(shù)將套接字連接到 sockaddr_in 結(jié)構(gòu)體中描述的IP地址和端口號。如果連接失敗,將返回一個負(fù)數(shù)值。

ch = read(0, buf, 128);:從標(biāo)準(zhǔn)輸入讀取最多128個字節(jié)的數(shù)據(jù),并將其存儲在 buf 中。

send(socket_fd, buf, ch, 0):將讀取的數(shù)據(jù)發(fā)送到服務(wù)器。如果發(fā)送失敗,將返回一個負(fù)數(shù)值。

close(socket_fd);:關(guān)閉套接字。

在主循環(huán)中,該客戶端將不斷地從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)并將其發(fā)送到服務(wù)器,直到程序被強(qiáng)制終止。

結(jié)果展示

服務(wù)器向客戶端發(fā)送數(shù)據(jù),網(wǎng)絡(luò)編程,tcp/ip,服務(wù)器,網(wǎng)絡(luò)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-606623.html

到了這里,關(guān)于TCP實現(xiàn)服務(wù)器和客戶端通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 網(wǎng)絡(luò)通信(13)-C#TCP服務(wù)器和客戶端同時在一個進(jìn)程實現(xiàn)的實例

    網(wǎng)絡(luò)通信(13)-C#TCP服務(wù)器和客戶端同時在一個進(jìn)程實現(xiàn)的實例

    有時項目需求中需要服務(wù)器和客戶端同時在一個進(jìn)程實現(xiàn),一邊需要現(xiàn)場接收多個客戶端的數(shù)據(jù),一邊需要將數(shù)據(jù)匯總后發(fā)送給遠(yuǎn)程服務(wù)器。下面通過實例演示此項需求。 C#TCP服務(wù)器和客戶端同時在一個進(jìn)程實現(xiàn)的實例如下: 界面設(shè)計 UI文件代碼

    2024年01月22日
    瀏覽(34)
  • S7-200SMART 實現(xiàn)MODBUS TCP通信的具體方法示例(客戶端讀寫+服務(wù)器響應(yīng))

    S7-200SMART 實現(xiàn)MODBUS TCP通信的具體方法示例(客戶端讀寫+服務(wù)器響應(yīng))

    前面和大家介紹了MODBUS TCP的基本使用方法,具體可參考以下鏈接中的內(nèi)容: S7-200SMART實現(xiàn)MODBUS TCP通信(客戶端+服務(wù)器)的具體方法和步驟示例 本次繼續(xù)和大家分享S7-200SMART 中實現(xiàn)MODBUS TCP通信的具體方法 , 任務(wù)要求:

    2024年02月16日
    瀏覽(51)
  • 簡易TCP客戶端和服務(wù)器端通信

    #includeiostream #include winsock2.h ? #include ws2tcpip.h ? #includestdlib.h using namespace std; #define ?BUF_SIZE ?1024 int main() { ? ? cout \\\"客戶端\\\" endl; ? ? //設(shè)置Winsock版本, ? ? WSADATA ? wsaData; ? ? if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0) ? ? { ? ? ? ? cout \\\"error\\\" endl; ? ? ? ? exit(1); ? ? } ? ? //創(chuàng)建通

    2024年04月29日
    瀏覽(23)
  • 網(wǎng)絡(luò)編程3——TCP Socket實現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    網(wǎng)絡(luò)編程3——TCP Socket實現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    本人是一個剛剛上路的IT新兵,菜鳥!分享一點自己的見解,如果有錯誤的地方歡迎各位大佬蒞臨指導(dǎo),如果這篇文章可以幫助到你,勞請大家點贊轉(zhuǎn)發(fā)支持一下! 今天分享的內(nèi)容是TCP流套接字實現(xiàn)的客戶端與服務(wù)器的通信,一定要理解 DatagramSocket,DatagramPacket 這兩個類的作用以及方法

    2024年02月12日
    瀏覽(77)
  • Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實現(xiàn)客戶端服務(wù)器通信(保姆級教學(xué), 附代碼)

    Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實現(xiàn)客戶端服務(wù)器通信(保姆級教學(xué), 附代碼)

    ??各位讀者好, 我是小陳, 這是我的個人主頁 ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過博客輸出所學(xué)知識 ??如果本篇對你有幫助, 煩請點贊關(guān)注支持一波, 感激不盡 ?? 希望我的專欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語法, 類和對象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書管理系統(tǒng)

    2024年02月05日
    瀏覽(33)
  • TCP/IP客戶端和服務(wù)器端建立通信過程

    TCP/IP客戶端和服務(wù)器端建立通信過程

    使用Qt提供的類進(jìn)行基于 TCP 的套接字通信需要用到兩個類: QTcpServer 類用于監(jiān)聽客戶端連接以及和客戶端建立連接,在使用之前先介紹一下這個類提供的一些常用API函數(shù): 構(gòu)造函數(shù) 給監(jiān)聽的套接字設(shè)置監(jiān)聽 listen() 函數(shù) 在代碼中 通過啟動監(jiān)聽按鈕 設(shè)置監(jiān)聽 參數(shù): address :

    2024年02月07日
    瀏覽(23)
  • Linux下TCP網(wǎng)絡(luò)服務(wù)器與客戶端通信程序入門

    Linux下TCP網(wǎng)絡(luò)服務(wù)器與客戶端通信程序入門

    實現(xiàn)客戶端連接服務(wù)器,通過終端窗口發(fā)送信息給服務(wù)器端,服務(wù)器接收到信息后對信息數(shù)據(jù)進(jìn)行回傳,客戶端讀取回傳信息并返回。 服務(wù)器當(dāng)前IP地址要知道 建立socket 綁定本地IP地址并設(shè)置端口號 知道服務(wù)器的IP地址和端口號 然后進(jìn)行連接

    2024年02月14日
    瀏覽(33)
  • TCP通信之QTcpServer和QTcpSocket,服務(wù)器和客戶端通訊

    TCP通信之QTcpServer和QTcpSocket,服務(wù)器和客戶端通訊

    TCP傳輸控制協(xié)議 是一個可靠的(相對于UDP),面向流,面向連接的運輸協(xié)議。 Socket 俗稱“套接字”。就是對網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點的抽象。一個套接字就是網(wǎng)絡(luò)上進(jìn)程通信的一端,提供了應(yīng)用層進(jìn)程利用網(wǎng)絡(luò)協(xié)議交換數(shù)據(jù)的機(jī)制。從所處的地

    2024年02月12日
    瀏覽(32)
  • 【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    TCP服務(wù)器與客戶端的搭建需要借助以下API ServerSocket 是創(chuàng)建TCP服務(wù)端Socket的API。 ServerSocket 構(gòu)造方法 : 方法簽名 方法說明 ServerSocket(int port) 創(chuàng)建一個服務(wù)端流套接字Socket,并綁定到指定端口 ServerSocket 方法: 方法簽名 方法說明 Socket accept() 開始監(jiān)聽指定端口(創(chuàng)建時綁定的端

    2024年03月12日
    瀏覽(34)
  • GEC6818網(wǎng)絡(luò)編程——服務(wù)器端與客戶端tcp的雙向通信

    網(wǎng)絡(luò)編程之實現(xiàn)服務(wù)器和客戶端的tcp雙向通信,前面是雙向通信的詳細(xì)流程介紹,后面附上完整的代碼o(  ̄▽ ̄ )ブ 1.1 服務(wù)器端雙向通信的詳細(xì)流程敘述 創(chuàng)建TCP套接字 : 使用 socket 函數(shù)創(chuàng)建一個TCP套接字。這里使用了IPv4地址族 AF_INET 和流式套接字 SOCK_STREAM 。 綁定IP和端口

    2024年02月21日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包