Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tcp socket api

tcp socket api

作者头像
changan
发布于 2020-11-04 07:04:04
发布于 2020-11-04 07:04:04
54800
代码可运行
举报
运行总次数:0
代码可运行

socket是网络协议栈的抽象

socket api在tcp中的体现

TCP三次握手后有个accept队列,进到这个队列才能从Listen变成accept,默认backlog 值是50。

如上图所示,这里有两个队列:syns queue(半连接队列);accept queue(全连接队列) 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client,第三步的时候server收到client的ack,如果这时全连接队列没满,那么从半连接队列拿出相关信息放入到全连接队列中。

当接收到3次握手中的ACK分组时,将它们移动到accept队列。 显而易见,accept系统调用只是简单地从完成队列中取出连接。 在这种情况下,listen syscall的backlog参数表示完成队列的大小。

code

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
tcpechosvr.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>

#define SRVIP "127.0.0.1"
#define SRVPORT 10005
#define MAX_NUM 1024

int main()
{
   int serverSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(serverSock < 0)
    {
        printf("socket creation failed\n");
        exit(-1);
    }
    printf("socket create successfully.\n");

    struct sockaddr_in serverAddr;
    memset(&serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_port = htons((u_short)SRVPORT);
    serverAddr.sin_addr.s_addr = inet_addr(SRVIP);

    if(bind(serverSock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr))==-1)
    {
        printf("Bind error.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);
        exit(-1);
    }
    printf("Bind successful.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);

        /*  把sock链接进入监听哈希表listening_hash & 创建半连接队列的实例,初始化全连接队列 */
    if(listen(serverSock,10)==-1)
    {
        printf("Listen error!\n");
    }
    printf("Listening on port[%d]\n", serverAddr.sin_port);

    char recvBuf[MAX_NUM]={0};
    while(1)
    {
        struct sockaddr clientAddr;
        int size = sizeof(clientAddr);

        /* 从全连接队列中取  */
        int clientSock = accept(serverSock, &clientAddr, &size);
        printf("***SYS***    New client touched.\n");
        while(1)
        {
            //一直接收客户端socket的send操作
            if(recv(clientSock, recvBuf, MAX_NUM, 0) == -1)
            {
                printf("read error.\n");
            }
            else
            {
                printf("receiv from client:%s\n",recvBuf);
            }

            // 向客户端发送套接字
            if(send(clientSock, recvBuf , sizeof(recvBuf), MSG_NOSIGNAL) == -1)
            {
                printf("Send error!\n");
            }
            else
            {
                printf("Send to client:%s\n", recvBuf);
            }
            if( strcmp(recvBuf, "bye") == 0)
            {
                break;
            }
            memset(recvBuf, 0, sizeof(recvBuf));
        }
        close(clientSock);
    }
    close(serverSock);
    return 0;
}

REF

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用socket实现TCP和UDP传输
转载自:https://blog.csdn.net/timmiy/article/details/51946093
战神伽罗
2019/09/03
1.7K0
使用socket实现TCP和UDP传输
监测网络状态(AFNetworking) 服务端 客户端
//监测网络状态(AFNetworking) import "ViewController.h" //引入第三方框架 import "AFNetworking/AFNetworking.h" @interface ViewController () @end @implementation ViewController (void)viewDidLoad { [super viewDidLoad]; //检查网络状态 [self checkNetworkStates]; } #pragma m
用户7108768
2021/10/29
1.1K0
Socket编程---TCP篇
但是,并不是说,TCP就是百利而无一害的。前面说了,TCP还有一个特性---面向字节流,这就导致了,目标主机读取到的内容可能并不是完整的源主机发送的内容。此处来填补这个知识。
小灵蛇
2024/09/07
880
Socket编程---TCP篇
网络协议-简易TCP-1.0
SOCKET _sock = socke(AF_INET,SOCKET_STREAM,IPPROTO_TCP);
Wilbur-L
2020/12/13
4550
网络协议-简易TCP-1.0
socket技术详解(看清socket编程)
socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做个总结性的文章
全栈程序员站长
2022/09/14
3.7K0
socket技术详解(看清socket编程)
再聊 TCP backlog
关于三次握手,还有很多细节之前的文章没有详细介绍,这篇文章我们以 backlog 参数来深入研究一下建连的过程。通过阅读这篇文章,你会了解到下面这些知识:
挖坑的张师傅
2022/05/13
1.1K0
再聊 TCP backlog
socket基本连接
基本操作 服务端 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <iostream> #include <string.h> int main(int argc, char* argv[]) { std::cout << "begin" << std::endl; //1.创建一个侦听socket int listenfd
opencode
2022/12/26
6720
漫画C语言 做个聊天软件你不懂也得懂
学完C语言做不出东西?不存在的,咱们做一个最“隐私”的聊天器,就俩人,你和我。咱们聊天的信息你知我知没别人知。 没学过C语言的,觉得难的看这里:https://blog.csdn.net/a757291228/category_11468001.html
1_bit
2022/01/06
8130
漫画C语言 做个聊天软件你不懂也得懂
网络编程第三讲UDP编写
  UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP
IBinary
2019/05/25
4490
day01-从一个基础的socket服务说起
在linux中,一切都是文件,所有文件都有一个int类型的编号,称为文件描述符。服务端和客户端通信本质是在各自机器上创建一个文件,称为socket(套接字),然后对该socket文件进行读写。
会玩code
2022/04/24
1.3K2
day01-从一个基础的socket服务说起
Tcp协议Socket编程
  本次socket编程需要使用到 日志文件,此为具体日志编写过程。以及 线程池,线程池原理比较简单,看注释即可。
用户11029129
2024/11/22
730
Tcp协议Socket编程
一文学会 | linux socket编程----TCP
TCP 是基于连接的数据流的协议,先建立连接再进行通信,而且在通信过程中会检查数据是否发送成功。优点就是保证数据的完整性和准确性,缺点就是效率较低。
混说Linux
2022/07/14
3740
一文学会 | linux socket编程----TCP
C/C++ 使用Socket模拟远程CMD
服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //把ws2_32.lib加到Link页的连接库 #define PORT 15001 //通信的端口(指服务器端) #define ERROR 0 #define BUFFER_SIZE 1024 //注意:此Server端数据接收缓冲区 >= Clie
王瑞MVP
2022/12/28
5870
Socket编程实践(2) Socket API 与 简单例程
在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程。该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端。 socket()函数 socket()函数用于创建一个套接字。这就好像购买了一个电话。不过该电话还没有分配号码。 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol
Tencent JCoder
2018/07/02
8720
socket 实现最小化UDP广播程序
广播是某一个终端给一个子网发送数据,这个子网可以是本地的最小化子网,比如 192.168.1.255,也可以是整个子网 255.255.255.255,这取决于你要发送的范围,本文中只介绍一个最小化的广播程序,值得注意的是,即使客户端没有设定IP地址,它依然是可以接收到广播数据的。
我与梦想有个约会
2023/10/20
2200
socket 实现最小化UDP广播程序
【socket笔记】TCP、UDP通信总结
Socket的英文原义是“孔”或“插座”。在编程中,Socket被称做套接字,是网络通信中的一种约定。Socket编程的应用无处不在,我们平时用的QQ、微信、浏览器等程序,都与Socket编程有关。我们平时使用浏览器查资料,这个过程的技术原理是怎样的呢?
正念君
2019/11/28
4.1K0
【socket笔记】TCP、UDP通信总结
14.8 Socket 一收一发通信
通常情况下我们在编写套接字通信程序时都会实现一收一发的通信模式,当客户端发送数据到服务端后,我们希望服务端处理请求后同样返回给我们一个状态值,并以此判断我们的请求是否被执行成功了,另外增加收发同步有助于避免数据包粘包问题的产生,在多数开发场景中我们都会实现该功能。
王瑞MVP
2023/10/16
2920
14.8 Socket 一收一发通信
一个简单的Windows Socket可复用框架
一个简单的Windows Socket可复用框架 说起网络编程,无非是建立连接,发送数据,接收数据,关闭连接。曾经学习网络编程的时候用Java写了一些小的聊天程序,Java对网络接口函数的封装还是很简单实用的,但是在Windows下网络编程使用的Socket就显得稍微有点繁琐。这里介绍一个自己封装的一个简单的基于Windows Socket的一个框架代码,主要目的是为了方便使用Windows Socket进行编程时的代码复用,闲话少说,上代码。 熟悉Windows Socket的都知道进行Windows网络
Florian
2018/02/05
1.7K0
一个简单的Windows Socket可复用框架
【Linux网络#17】TCP全连接队列与tcpdump抓包
此时启动 1 个客户端同时连接服务器, 用 netstat 查看服务器状态, 一切正常,如下:
IsLand1314
2025/05/06
600
【Linux网络#17】TCP全连接队列与tcpdump抓包
UDP-Socket一般流程(Windows)
一、 服务端构建步骤 1.初始化套接字环境WSAStartup 2.初始化地址和端口 3.创建UDP套接字socket 4.绑定端口bind 5.用recvfrom接收数据 6.用sendto发送数据 7.退出或者返回5步骤继续 二、客户端构建步骤 1.初始化套接字环境WSAStartup 2.初始化地址和端口 3.创建UDP套接字socket 4.用sendto发送数据 5.用recvfrom接收数据 三、示例代码 Sever: #include <winso
TSINGEYE清眸物联
2023/01/04
5040
相关推荐
使用socket实现TCP和UDP传输
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验