RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TCP/UDP網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí)合集2

jf_78858299 ? 來(lái)源:百問(wèn)科技 ? 作者:韋東山 ? 2023-05-18 17:31 ? 次閱讀

所需要頭文件

#include

#include

函數(shù)格式

int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);

函數(shù)功能

用來(lái)請(qǐng)求連接遠(yuǎn)程服務(wù)器,將參數(shù)sockfd的socket連至參數(shù)serv_addr所指定的服務(wù)器IP和端口號(hào)上去;

sockfd:客戶端的socket套接字

serv_addr:一個(gè)struct sockaddr類型的結(jié)構(gòu)體指針變量,存儲(chǔ)著遠(yuǎn)程服務(wù)器的IP與端口號(hào)信息

addrlen:結(jié)構(gòu)體變量的長(zhǎng)度

返回值

若成功,返回0,否則返回-1,錯(cuò)誤信息存在errno中;

d. 發(fā)送

1            send_buf = send(sock_fd, send_buf, strlen(send_buf), 0);
2            if (send_buf <= 0)
3            {
4                fprintf(stderr,"send error:%s\\n\\a", strerror(errno));
5                close(sock_fd);
6                exit(1);
7            }

所需要頭文件

#include

#include

函數(shù)格式

int send(int sockfd, const void *buf, int len, int flags);

函數(shù)功能

用來(lái)發(fā)送數(shù)據(jù)給指定的遠(yuǎn)端主機(jī);

sockfd:客戶端的socket套接字

buf:指明一個(gè)緩沖區(qū)

len:指明緩沖區(qū)的長(zhǎng)度

flags:通常為0

返回值

若成功,返回發(fā)送的字節(jié)數(shù),否則返回-1,錯(cuò)誤信息存在errno中

d. 關(guān)閉socket

1    close(sock_fd);
2    exit(0);

3.3 TCP完整代碼

1/*
  2* tcp_server.c
  3# Copyright (C) 2017 hceng, 
  9#include 
 10#include 
 11#include       
 12#include 
 13#include 
 14#include 
 15#include 
 16#include 
 17#include 
 18#include 
 19#include 
 20
 21#define PORT_NUMBER 8888
 22#define BACKLOG     10
 23
 24/* socket->bind->listen->accept->send/recv->close*/
 25
 26int main(int argc, char **argv)
 27{
 28    int sock_fd, new_fd;
 29    struct sockaddr_in server_addr;
 30    struct sockaddr_in client_addr;
 31    int ret;
 32    int addr_len;
 33    int recv_len;
 34    unsigned char recv_buf[1000];
 35    int client_num = -1;
 36
 37    signal(SIGCHLD,SIG_IGN);
 38
 39    /* socket */
 40    sock_fd = socket(AF_INET, SOCK_STREAM, 0);//AF_INET:IPV4;SOCK_STREAM:TCP
 41    if (-1 == sock_fd)
 42    {
 43        fprintf(stderr,"socket error:%s\\n\\a", strerror(errno));
 44        exit(1);
 45    }
 46
 47    /* set server sockaddr_in */
 48    memset(&server_addr, 0, sizeof(struct sockaddr_in));//clear
 49    server_addr.sin_family = AF_INET;
 50    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY:This machine all IP
 51    server_addr.sin_port = htons(PORT_NUMBER);
 52
 53    /* bind */
 54    ret = bind(sock_fd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));
 55    if(-1 == ret)
 56    {
 57        fprintf(stderr,"bind error:%s\\n\\a", strerror(errno));
 58        close(sock_fd);
 59        exit(1);
 60    }
 61
 62    /* listen */
 63    ret = listen(sock_fd, BACKLOG);
 64    if (-1 == ret)
 65    {
 66        fprintf(stderr,"listen error:%s\\n\\a", strerror(errno));
 67        close(sock_fd);
 68        exit(1);
 69    }
 70
 71    /* accept */
 72    while(1)
 73    {
 74        addr_len = sizeof(struct sockaddr);
 75        new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addr_len);
 76        if (-1 == new_fd)
 77        {
 78            fprintf(stderr,"accept error:%s\\n\\a", strerror(errno));
 79            close(sock_fd);
 80            exit(1);
 81        }
 82
 83        client_num++;
 84        fprintf(stderr, "Server get connetion form client%d: %s\\n", client_num, inet_ntoa(client_addr.sin_addr));
 85
 86        if (!fork())
 87        {
 88            /* Child process */
 89            while (1)
 90            {
 91                /* recv */
 92                recv_len = recv(new_fd, recv_buf, 999, 0);
 93                if (recv_len <= 0)
 94                {
 95                    fprintf(stderr, "recv error:%s\\n\\a", strerror(errno));
 96                    close(new_fd);    
 97                    exit(1);
 98                }
 99                else
100                {
101                    recv_buf[recv_len] = '\\0';
102                    printf("Get msg from client%d: %s\\n", client_num, recv_buf);
103                }
104            }    
105            close(new_fd);            
106        }       
107    }
108
109    /* close */
110    close(sock_fd);
111    exit(0); 
112}
1/*
 2* tcp_client.c
 3# Copyright (C) 2017 hceng, 
 9#include 
10#include 
11#include 
12#include 
13#include 
14#include 
15#include 
16#include 
17#include 
18#include 
19
20#define PORT_NUMBER 8888
21
22/* socket->connect->send->close*/
23int main(int argc, char *argv[])
24{
25    int sock_fd;
26    struct sockaddr_in server_addr;
27    int ret;
28    unsigned char send_buf[1000];
29    int send_len;
30
31    if(argc != 2)
32    {
33        fprintf(stderr, "Usage:%s hostname\\n\\a", argv[0]);
34        exit(1);
35    }
36
37    /* socket */
38    sock_fd = socket(AF_INET, SOCK_STREAM, 0);//AF_INET:IPV4;SOCK_STREAM:TCP
39    if (-1 == sock_fd)
40    {
41        fprintf(stderr,"socket error:%s\\n\\a", strerror(errno));
42        exit(1);
43    }
44
45    /* set sockaddr_in parameter*/
46    memset(&server_addr, 0, sizeof(struct sockaddr_in));//clear
47    server_addr.sin_family = AF_INET;
48    server_addr.sin_port = htons(PORT_NUMBER);
49    ret = inet_aton(argv[1], &server_addr.sin_addr);
50    if(0 == ret)
51    {
52        fprintf(stderr,"server_ip error.\\n");
53        close(sock_fd);
54        exit(1);
55    }
56
57    /* connect */
58    ret = connect(sock_fd, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr));    
59    if (-1 == ret)
60    {
61        fprintf(stderr,"connect error:%s\\n\\a", strerror(errno));
62        close(sock_fd);
63        exit(1);
64    }
65
66    while (1)
67    {
68        if (fgets(send_buf, 999, stdin))
69        {
70            /* send */
71            send_len = send(sock_fd, send_buf, strlen(send_buf), 0);
72            if (send_len <= 0)
73            {
74                fprintf(stderr,"send error:%s\\n\\a", strerror(errno));
75                close(sock_fd);
76                exit(1);
77            }
78        }
79    }
80
81    /* close */
82    close(sock_fd);
83    exit(0);
84}

3.4 測(cè)試結(jié)果

先在Ubuntu主機(jī)上交叉編譯服務(wù)器端代碼,再在Ubuntu主機(jī)上編譯客戶端代碼。

在開(kāi)發(fā)板上運(yùn)行服務(wù)器端代碼,在Ubuntu主機(jī)先啟動(dòng)tmux分屏,再分別運(yùn)行客戶端代碼。

  • 服務(wù)器端
  • 客戶機(jī)端
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79055
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    325

    瀏覽量

    33931
  • 網(wǎng)絡(luò)通信
    +關(guān)注

    關(guān)注

    4

    文章

    797

    瀏覽量

    29795
  • 網(wǎng)絡(luò)編程
    +關(guān)注

    關(guān)注

    0

    文章

    71

    瀏覽量

    10074
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    第16章 UDP用戶數(shù)據(jù)報(bào)協(xié)議基礎(chǔ)知識(shí)

    ) 16.1 初學(xué)者重要提示 16.2 UDP基礎(chǔ)知識(shí)參考資料 16.3 UDP基礎(chǔ)知識(shí)點(diǎn) 16.4 TCP
    發(fā)表于 11-02 17:27

    第27章 DNS域名系統(tǒng)基礎(chǔ)知識(shí)

    轉(zhuǎn)最新網(wǎng)絡(luò)教程本章節(jié)為大家講解DNS(Domain Name System,域名系統(tǒng)),通過(guò)前面章節(jié)對(duì)TCPUDP的學(xué)習(xí),需要大家對(duì)DNS也有個(gè)基礎(chǔ)的認(rèn)識(shí)。(本章的知識(shí)點(diǎn)主要整理自
    發(fā)表于 11-23 15:50

    網(wǎng)絡(luò)協(xié)議基礎(chǔ)知識(shí)推薦

    目錄一、基礎(chǔ)協(xié)議1、網(wǎng)絡(luò)分層模型2、協(xié)議劃分3、重點(diǎn)解析1)TCP/IP和UDP協(xié)議2)HTTP和HTTPS協(xié)議3)WS和WSS協(xié)議4)SS
    發(fā)表于 07-02 06:56

    嵌入式網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識(shí)

    2章 嵌入式網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識(shí)本章教程為大家介紹嵌入式網(wǎng)絡(luò)協(xié)議棧基礎(chǔ)知識(shí),本章先讓大家有一個(gè)全面的認(rèn)識(shí),后面章節(jié)中會(huì)為大家逐一講解用到的協(xié)
    發(fā)表于 08-03 06:24

    TCP(IP)協(xié)議與網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)--TCP(IP)協(xié)議與網(wǎng)絡(luò)編程
    發(fā)表于 09-01 15:01 ?0次下載

    TCP-IP_Socket網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)--TCP-IP_Socket網(wǎng)絡(luò)編程
    發(fā)表于 09-01 15:01 ?0次下載

    TCP協(xié)議基礎(chǔ)知識(shí)

    TCP 是互聯(lián)網(wǎng)核心協(xié)議之一,本文介紹它的基礎(chǔ)知識(shí)。
    的頭像 發(fā)表于 10-16 10:29 ?3621次閱讀
    <b class='flag-5'>TCP</b>協(xié)議<b class='flag-5'>基礎(chǔ)知識(shí)</b>

    udptcp的區(qū)別在哪里

    主要介紹udptcp的區(qū)別在哪里,以及TCP協(xié)議和UDP協(xié)議為什么會(huì)共存?通常我們?cè)谡f(shuō)到網(wǎng)絡(luò)編程
    發(fā)表于 12-08 14:08 ?8582次閱讀

    TCP UDPSocket調(diào)試工具應(yīng)用程序和GPRS DTU數(shù)傳應(yīng)用的基礎(chǔ)知識(shí)合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP UDPSocket調(diào)試工具應(yīng)用程序和GPRS DTU數(shù)傳應(yīng)用的基礎(chǔ)知識(shí)合集。
    發(fā)表于 11-14 17:41 ?13次下載
    <b class='flag-5'>TCP</b> UDPSocket調(diào)試工具應(yīng)用程序和GPRS DTU數(shù)傳應(yīng)用的<b class='flag-5'>基礎(chǔ)知識(shí)</b><b class='flag-5'>合集</b>

    tcpudp協(xié)議的異同

    UDP 校驗(yàn)和則是包含 UDP 首部和數(shù)據(jù)在內(nèi)的校驗(yàn)結(jié)果。 TCP協(xié)議 TCP協(xié)議基于網(wǎng)絡(luò)層的 IP 協(xié)議提供的是有連接、可靠服務(wù),是基于
    的頭像 發(fā)表于 11-12 14:45 ?4068次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>協(xié)議的異同

    基于Socket的UDPTCP編程解析 1

    TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議是網(wǎng)絡(luò)體系結(jié)TCP/IP模型中傳輸層一層中的兩個(gè)不同的通信協(xié)議。 TCP:傳輸控制協(xié)議,
    的頭像 發(fā)表于 05-18 17:22 ?962次閱讀
    基于Socket的<b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b><b class='flag-5'>編程</b>解析 1

    基于Socket的UDPTCP編程解析 2

    TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議是網(wǎng)絡(luò)體系結(jié)TCP/IP模型中傳輸層一層中的兩個(gè)不同的通信協(xié)議。 TCP:傳輸控制協(xié)議,
    的頭像 發(fā)表于 05-18 17:22 ?649次閱讀
    基于Socket的<b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b><b class='flag-5'>編程</b>解析 <b class='flag-5'>2</b>

    TCP/UDP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)合集1

    本文主要記錄TCP/UDP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí),采用TCP/U
    的頭像 發(fā)表于 05-18 17:31 ?700次閱讀

    TCP/UDP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)合集3

    本文主要記錄TCP/UDP網(wǎng)絡(luò)編程基礎(chǔ)知識(shí),采用TCP/U
    的頭像 發(fā)表于 05-18 17:31 ?785次閱讀
    <b class='flag-5'>TCP</b>/<b class='flag-5'>UDP</b><b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>編程</b>的<b class='flag-5'>基礎(chǔ)知識(shí)</b><b class='flag-5'>合集</b>3

    TCPUDP的基本區(qū)別

    順序,UDP不保證 UDP應(yīng)用場(chǎng)景: 面向數(shù)據(jù)報(bào)方式 網(wǎng)絡(luò)數(shù)據(jù)大多為短消息 擁有大量Client 對(duì)數(shù)據(jù)安全性無(wú)特殊要求 網(wǎng)絡(luò)負(fù)擔(dān)非常重,但對(duì)響應(yīng)速度要求高
    的頭像 發(fā)表于 11-13 15:27 ?4610次閱讀
    <b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b>的基本區(qū)別
    RM新时代网站-首页