TCP编程

网络编程之TCP通信 本文主要是在教大家如何搭建一个TCP通信的模型,构建一个·简易的服务端和客户端,进行数据的收发。此文是本人在学习时写作,如有错误还请多多包涵。 阅读详情

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?v=&ID=2395276

gdtyy 发表于 2007-1-1 22:49 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

******************
* 第五讲 TCP编程 *
******************
    2007/01/01  asdjf@163.com  www.armecos.com
    
    下面是TCP测试源码,略微不同的是一开始要先执行“init_all_network_interfaces();”,同时判断网卡是否安装(条件判断CYGHWR_NET_DRIVER_ETH0)。剩下的部分就全是标准写法。这里用到的一些socket函数有阻塞功能,不需要额外延时,所以处理速度很快。此程序配合IE浏览器使用,在浏览器里输入192.168.0.6<回车>就可以浏览到静态网页。
    
TCP测试源码
//此程序配合IE浏览器

#include <network.h>

#include <pkgconf/system.h>
#include <pkgconf/net.h>

#include <cyg/infra/testcase.h>

#ifdef CYGBLD_DEVS_ETH_DEVICE_H    // Get the device config if it exists
#include CYGBLD_DEVS_ETH_DEVICE_H  // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
#endif

#ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
# ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
#  include CYGTST_DEVS_ETH_TEST_NET_REALTIME
# endif
#endif

#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x1000)
static char stack[STACK_SIZE],stack1[STACK_SIZE];
static cyg_thread thread_data,thread_data1;
static cyg_handle_t thread_handle,thread_handle1;

unsigned char httpweb[]={
    "HTTP/1.0 200 OK/r/n"
    "Date: Mon, 24 Nov 2003 01:24:17 GMT/r/n"
    "Server: microHttp/1.0 Zlgmcu Corporation/r/n"
    "Accept-Ranges: bytes/r/n"
    //"Content-Length: 116/r/n"//"Connection: Keep-Alive/r/n"
    "Connection: Keep-Close/r/n"
    "Content-Type: text/html/r/n"
    "/r/n"
    };

unsigned char web[]={
    "<HTML>/r/n"
    "<HEAD>/r/n"
    "<TITLE>ARM_NET演示网页(周立功单片机)</TITLE>/r/n"
    "<BODY aLink=green background=/100.bmp bgColor=#f1f1dd link=red/r/n"
    "vLink=#321afd>/r/n"
    "<H1>HELLO WELCOME TO EasyArm WEBSERVER</H1>/r/n"
    "<UL>/r/n"
    "<LI> <A HREF=/"http://www.zlgmcu.com//">周立功单片机网站 </A>/r/n"
    "<LI> <A HREF=/"http://www.zlg.cn//">周立功单片机内部BBS </A>/r/n"
    "<LI> <A HREF=/"http://www.zlgmcu.cn//">周立功单片机 </A>/r/n"
     "</UL>/r/n"
    "</BODY>/r/n"
    "</HTML>/r/n"
    };

unsigned char httpgif[]={
    "HTTP/1.0 200 OK/r/n"
    "Date: Mon, 24 Nov 2003 01:24:17 GMT/r/n"
    "Server: microHttp/1.0 Zlgmcu Corporation/r/n"
    "Accept-Ranges: bytes/r/n"
    //"Content-Length: 116/r/n"//"Connection: Keep-Alive/r/n"
    "Connection: Keep-Close/r/n"
    "Content-Type: image/bmp/r/n"
    "/r/n"
    };

unsigned char bmp[442]={
0x42,0x4d,0xb6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x1a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
0x00,0x00,0x40,0x01,0x00,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,
0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,
0x00,0x00,0xc0,0xc0,0xc0,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0xff,0x00,0x00,0xff,
0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,
0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf6,0x66,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0x66,0x66,0x6f,0x6f,0xff,0x66,0x66,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0xff,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x6f,0xff,0x6f,0xf6,0xff,0xf6,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xf6,0xff,0xf6,0xf6,0xff,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0x6f,0xf6,0xff,0x6f,0xff,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xf6,0x66,0x66,0xf6,0xff,0xf6,0x66,
0x6f,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0x00,0x00,0x00
};

void
pexit(char *s)
{
    CYG_TEST_FAIL_FINISH(s);
}

void
webserver_test(struct bootp *bp)
{
    //struct protoent *p;
    //struct timeval tv;
    struct sockaddr_in host,client;
    int s,sa,e_source,len;
    unsigned char buf[400];

    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0) {
        pexit("socket");
        return;
    }
    
    // Set up host address
    host.sin_family = AF_INET;
    host.sin_len = sizeof(host);
    host.sin_addr.s_addr = INADDR_ANY;
    host.sin_port = ntohs(80);
    
    if(bind(s, (struct sockaddr *) &host, sizeof(host)) < 0) {
        pexit("bind /source/ error");
    }
    
    listen(s, SOMAXCONN);
    
    while(true){
        memset(buf, 0, sizeof(buf));
        
        if ((sa = accept(s, (struct sockaddr *)&client, &len)) < 0) {
            printf("Accept ERROR!/n");
            continue;
        }
        
        printf("SERVER : HTTP request arrived from %s:%d/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        
        len = read(sa, buf, sizeof(buf));

        if(buf[5] == ' '){
            len = write(sa, httpweb, sizeof(httpweb)-1);
            len = write(sa, web, sizeof(web));
        }
        else if(buf[5] == '1'){
            len = write(sa, httpgif, sizeof(httpgif)-1);
            len = write(sa, bmp,sizeof(bmp));
        }

        close(sa);
    }
}

void
net_test(cyg_addrword_t p)
{
    diag_printf("Start Networking Test.../n");

    init_all_network_interfaces();
    
#ifdef CYGHWR_NET_DRIVER_ETH0
    if (eth0_up) {
        cyg_thread_create(10,                // Priority - just a number
                      webserver_test,        // entry
                      (cyg_addrword_t)&eth0_bootp_data,      // entry parameter
                      "Network tcp test",    // Name
                      &stack1[0],            // Stack
                      STACK_SIZE,            // Size
                      &thread_handle1,       // Handle
                      &thread_data1          // Thread data structure
            );
        cyg_thread_resume(thread_handle1);  // Start it
    }
#endif

}

void
cyg_start(void)
{
    // Create a main thread, so we can run the scheduler and have time 'pass'
    cyg_thread_create(10,                // Priority - just a number
                      net_test,          // entry
                      0,                 // entry parameter
                      "Network test",    // Name
                      &stack[0],         // Stack
                      STACK_SIZE,        // Size
                      &thread_handle,    // Handle
                      &thread_data       // Thread data structure
            );
    
    cyg_thread_resume(thread_handle);  // Start it
    cyg_scheduler_start();
}


附录:关于在各种介质上提高TCP速率的分析  2006/03/13

    TCP的传输速率取决于重传延时,只要尽量避免重传,就能提高传输速度。TCP通过CRC检错和错误重传机制实现可靠传输。TCP传输速度 = 有效传输字节数 / 传输时间 。在传输字节数相同的情况下,减少传输时间就可以提高速度。
    
    传输时间由CPU处理时间、传输往返时间、重传消耗时间三部分组成。
    
    其中,CPU处理时间一般可以忽略不计,因为现代的CPU单条指令执行时间是ns或us量级的,而TCP定时器是200ms量级的,即使代码量膨胀上万倍,所消耗的时间与TCP定时器时间比起来也微乎其微。
    
    传输往返时间是指从发出数据到接收到应答所耗费的时间,这个时间不能避免,不过,通过采用滑动窗技术,可以在一个往返时间内传输更多的数据,比停等协议显著提高了速度。在信号质量好的信道内,不妨将接收对告窗口设置得大些(如65535),这样,在接收到应答前,可以传输更多数据。另外,延迟200ms应答可以积攒更多数据,一次性发出,减少小数据包造成的头部开销浪费,这个延迟是有益的。
    
    重传是由于拥塞丢包、误码丢包、坏包、超时引起的,这是影响TCP传输速度最主要的原因,应尽量避免。虽然TCP是面向连接的协议,但它不像电路交换那样拥有信令通道,可以获得完备的链路信息。TCP不清楚当前链路情况,只能通过事后观察现象,试探或者推测出相关信息,例如往返时间,拥塞情况,链路恢复,丢包等等。这种“马后炮”式的做法势必造成不必要的时间浪费,此时事先预防比事后补救要有效得多。比如:事先开辟一个大的缓冲区按顺序缓存收到的有效包,再组装成一大块连续的数据块发送到应用层,这样就避免了人为地丢弃乱序包造成的丢包重传,而且即使在出现坏包的情况下也不用重传所有已经有效到达的数据包。不过,因为增加了排序组装、包缓冲区、内存管理代码,所以内存的占用量肯定会增大。
    
    标准的BSD TCP协议栈是很早以前在铜线网络上实现的,现在出现了很多新的传输介质,他们的特性对TCP传输速度有显著影响:
    
    (1)无线网络
        无线网络因其可移动特性,应用越来越多,如GPRS、CDMA、载波等。它的特点是误码率高,带宽小。当越区切换或者信号不好时可能会造成误码丢包,但是标准的BSD协议栈假设所有的丢包都是由于拥塞引起的,这在低误码率的铜线网络上是成立的,但在无线网络里,频繁的误码丢包会造成拥塞窗长时间保持在小窗口状态,即使无线信道恢复正常,拥塞控制算法仍然限制发送速率,尽管此时并没有发生拥塞。因此,在无线介质上的TCP协议栈要修正标准BSD协议栈的已经失效的假设,使其保持激进的发送策略,充分榨取宝贵的无线带宽,同时保持小的额外开销。改进方法......

    (2)卫星通道
        卫星通道的特点是延迟大,误码率低,带宽大。TCP若想保持高速,必须增大发送窗口,避免重传。比如:发送了10K数据,多次重传花费了5秒的时间,那么传输速率只有区区2K。避免重传的一个有效方法是预防性重发,一个包发好几遍,减小出错概率,不过带宽浪费大,反正卫星通道的带宽很大,用带宽换速度也划算。

    (3)高速光纤网络
        高速光纤网络的特点是误码率极低,带宽极大。按理说误码率低的话,标准TCP协议应该能很好地工作,不过,即使是误码率极低的情况,也还是会有出现误码的时候,此时,问题来了。丢包时,标准TCP会启动拥塞控制,它的恢复速度在高带宽低误码下显得过于保守,虽然相对损耗比例比较小,但绝对带宽损失大(会损失几十兆带宽),对于想榨干带宽利用率的我们来说,这是不能忍受的。此时需要增加更激进的快速恢复算法,用空间换时间。

    (4)铜线网络
        标准BSD协议栈就是在铜线网络上开发的,铜线网络的特点是误码率低,带宽大。TCP假设一切丢包都由拥塞引起。拥塞控制会影响效率,但能保证公平性,最终实现整体效率最高。

    TCP协议的速度还与任务划分有关,应该合理地安排TCP任务的优先级,使其能够获得充足的时间片。
    
    另外,ZLGIP的状态机写法是状态驱动的,我认为最好改成事件驱动,即在事件中判断状态,而不是在状态里判断事件,这样虽然增加了代码量,但思路更清晰。如下:
    发生关闭事件函数() //事件驱动
    {
        switch(state)
            case SYN:
            case SYN_SENT:
            case ESTABLISHED:
            case FIN_WAIT1:
            case FIN_WAIT2:
        ....
     }
     
     收到RST、SYN、FIN、ACK、数据包事件函数() //事件驱动
     {
        switch(state)
            case SYN:
            case SYN_SENT:
            case ESTABLISHED:
            case FIN_WAIT1:
            case FIN_WAIT2:
        ....
     }
     
     而不是按如下写法:
     Tcp_Established() //状态驱动
     {
         if(TCP_RST+TCP_SYN)
         else if(TCP_FIN)
         else if(TCP_ACK)
         ......
     }
     
     详见《状态机的两种写法》。
     
     综上,TCP的代码越庞大,速度越快,短小“精悍”的代码注定快不了,你要根据具体应用决定选择短小或者选择快速。一般TCP的数据最终都要交给硬件收发(串口/网卡),这些硬件能够自动以相应的速度收发数据,而且现在的CPU处理速度也不是瓶颈,所以,影响TCP速度的关键因素是算法。代码越大,意味着预防措施、异常处理、快速恢复等做得越充分,从而,减少重传,加快TCP速度。
 

Python TCP编程 TCP Socket Python中使用Socket编程 服务端 客户端 TCP 对于TCP,我想大部分同学不会陌生。TCP是一个网络层协议,通过TCP可以建立客户端到服务器的连接,并相互传递数据。那么在python中如何使用TCP来做一些操作呢? Socket Socket在网络编程中,是一个抽象概念。我们用socket来表示打开了一个从客户端到... 阅读详情

相关推荐

【Rust TCP编程】Rust网络编程之TCP编程语法解析与应用实战

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Rust中进行TCP编程前,我们需要了解一些基本概念: - 面向连接:通信双方必须先建立连接才能传输数据 - 可靠性:TCP保证数据按序到达,无差错、不丢失、不重复 - 全双工:连接双方可以同时发送和接收数据 - 流量控制:防止发送方发送过快导致接收方来不及处理 - 拥塞控制:防止网络过载 TCP使用IP地址和端口号来标识通信端点,通常表示为IP:Port的形式。

景天科技苑 4万+

TCP/IP之路由算法

网络层的重要功能就是路由和转发。而路由是根据路由器根据所维护的路由表进行路由选择。所以,如果创建和更新转发表就是一个很重要的问题。通常,在路由时,我们总是选取所需代价最小的一条路由。 首先,我们需要将网络进行抽象,最常见的抽象就是,将网络抽象成图结构。 每段链路的费用可以总是1,或者是,带宽的倒数、拥塞程度等。 关键问题: 源到目的(如u到z)的最小费用路径是什么

淡然坊 3408

cartographer从入门到精通(一):cartographer介绍

Cartographer的架构图我们可以看到白色框出来的三个区域,分别是Input Sensor Data(数据输入模块)Local SLAM(局部SLAM模块)Global SLAM (background thread)(全局SLAM模块)下面我们分别介绍一下这几个模块。

weixin_68094467的博客 1052

网络原理概述笔记(TCP/IP五层网络协议)

网络原理笔记整理,待补充

weixin_62756510的博客 1285

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 622

MacTeX+TeXstudio:Macbook配置本地Latex看这一篇就够了

这个博客记录本人在MacBook上配置本地Latex的流程,其中选择的编译环境为MacTeX,编辑器为TeXstudio。采用的原因主要两点:一个是本人配置的原因主要是用来撰写毕业论文,希望能够尽可能简化设置流程,专注内容表达;第二是由于本人还有一个windows系统的笔记本,想要编辑器在专注写作体验的同时在两个系统上能够都适配,从而减少切换效率,故选择此组合。这篇文章介绍并详细记录了本人的安装流程,有相同需求的同志也可借鉴。

Katherine-XY的博客 6982

网络编程之TCP编程

ipv4通信使用的结构体:struct sockaddr_in我们只需要直接定义结构体变量即可。

学习过程记录,欢迎大家交流互动,互相学习 2801

Python爬虫实战:全网政府招标信息采集与整合

本文详细介绍了如何使用Python构建一个完整的政府招标信息爬虫系统,涵盖了从数据采集、解析、存储到质量监控的全流程。多源采集:支持多个地方政府网站的同时采集智能解析:自动适应不同网站结构,智能提取关键信息异步高效:使用异步编程提高采集效率反爬应对:内置多种反爬虫应对策略数据质量:完善的数据清洗和质量监控机制易于扩展:模块化设计,便于添加新的数据源。

2201_76125261的博客 1380

Java 基于 TCP 的 Socket 编程

服务器端会主动监听某个指定的端口,客户端必须主动连接服务器的 IP 地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个 TCP 连接,双方后续就可以随时发送和接收数据。TCP 协议,指传输控制协议(TCP,Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。注意:服务端需要先于客户端启动,否则客户端因连接不到指定的进程而报错。实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。

swadian2008的博客 4495

IgH EtherCAT 从入门到精通:第 30 章 实战:高可用 EtherCAT 系统设计

摘要:构建高可用EtherCAT系统的关键技术 本章详细介绍了工业级EtherCAT系统的高可用性设计方法,主要包括: 冗余链路架构:采用双网卡环形拓扑设计,主备网卡同时工作,通过IgH Master的冗余配置实现线缆故障自动切换。 状态监控机制:提供专用API实时监控主备链路状态,包括从站响应数、链路状态和冗余激活标志,形成完整的故障判断矩阵。 自动恢复功能:系统内置FSM架构支持热插拔自动检测和重配置,从站断线/重连时可自动完成状态恢复,同时允许应用层实施安全措施。 这些技术共同构成了生产环境下Ethe

从事嵌入式linux android驱动开发,拥有全栈能力 243

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1657

linux下tcp编程

今天比较闲,玩一下linux下的TCP编程,下面是具体实现以及对TCP编程的具体总结。 服务端实现: #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<stdlib.h> #include<fcn...

c_shell_python的博客 4017

34 python 时间和日期

介绍python里时间和日期的常用方法,以及案例,还有注意事项。

水滴爬呀爬 347

【Linux】socket网络编程之TCP编程

本文主要介绍Linux操作系统下的网络编程之TCP协议编程的知识和编程流程。

weixin_61276540的博客 1190

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化

本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结

sundong_81的博客 59

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Qt之TCP编程

TCP是一种传输协议,定义了在网络中如何可靠地传输数据。套接字是一种网络编程接口,它允许应用程序通过特定的协议(如 TCP)进行网络通信。在实际编程中,您可能会使用套接字来实现 TCP 连接或其他类型的网络连接。例如,在 Qt 框架中,QTcpSocket类是一个套接字类,它提供了对 TCP 连接的支持。

m0_61408891的博客 926

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

十七、TCP编程

函数是网络编程中用于将套接字(socket)​与特定的IP地址和端口绑定的关键步骤,常用于服务端设置监听地址。​提取连接:从监听套接字的已完成连接队列​(已完成三次握手)中取出一个客户端连接。​生成新套接字:返回的已连接套接字与客户端一一对应,原监听套接字继续接受其他连接。​成功:返回一个新的已连接套接字描述符​(非负整数),专门用于与客户端通信。​成功:返回一个非负整数​(套接字文件描述符),后续操作(如。,套接字进入已连接状态(TCP)或设置默认地址(UDP)。

weixin_62330993的博客 964

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

网络编程(TCP编程)

多个应用层数据包被组合成一个 TCP 段发送。

Zz3528966192的博客 3190

Socket编程——TCP

​ TCP协议和UDP协议都属于网络通信协议,TCP协议是面向字节流的,UDP协议是面向数据报,这个特点后面会详谈的。listen可以理解为在景区餐馆旁边拉客的人,他的任务只是把你拉进餐馆,对于后续的服务并不做关心,在你进入餐馆后,继续进行拉客。accept可以理解为在你进入这个餐馆后进行招待的人,也就是由他来对你进行服务。TCP协议则需要建立连接,只有双方准备好才能进行报文的转发。UDP协议不需要连接,即报文一来就立刻进行转发。

2302_81016149的博客 812

Linux之Socket编程Tcp

Linux之Socket编程Tcp

2302_81120572的博客 1277

socket编程与TCP协议

Socket是网络通信的“接口”,也就是程序与网路之间的中介。它为开发者提供了一套通用的函数或API,允许程序通过网络发送和接收数据。具体地说,socket抽象了网络底层的细节。比如数据包的传输、协议选择、错误处理等,开发者只需要使用socket提供的函数来建立连接和传输数据,而不需要关心网络底层的实现socket的特点UDP协议在网络编程中通过函数设置选项,主要涉及SOL_SOCKET(通用套接字层)和(UDP协议层)两类选项。

逃离世界····· 1452
上一篇: ecos增值包应用举例---视频监控终端方案
下一篇: 串口操作
aaaaatiger
博客等级 码龄20年 535粉丝 627原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值