前往小程序,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通信总结
Socket的英文原义是“孔”或“插座”。在编程中,Socket被称做套接字,是网络通信中的一种约定。Socket编程的应用无处不在,我们平时用的QQ、微信、浏览器等程序,都与Socket编程有关。我们平时使用浏览器查资料,这个过程的技术原理是怎样的呢?
正念君
2019/11/28
4.1K0
【socket笔记】TCP、UDP通信总结
使用socket实现TCP和UDP传输
转载自:https://blog.csdn.net/timmiy/article/details/51946093
战神伽罗
2019/09/03
1.7K0
使用socket实现TCP和UDP传输
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
6690
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
5820
socket基于select的连接
select操作 服务端 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <iostream> #include <string.h> #include <sys/time.h> #include <vector> #include <errno.h> //自定义代表无效fd的值 #define INVALID_FD -1 int main(in
opencode
2022/12/26
8710
【C++】基础:网络编程介绍与TCP&UDP示例
网络传输模型可以抽象为7个层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
DevFrank
2024/07/24
4860
【C++】基础:网络编程介绍与TCP&UDP示例
一个简单的Windows Socket可复用框架
一个简单的Windows Socket可复用框架 说起网络编程,无非是建立连接,发送数据,接收数据,关闭连接。曾经学习网络编程的时候用Java写了一些小的聊天程序,Java对网络接口函数的封装还是很简单实用的,但是在Windows下网络编程使用的Socket就显得稍微有点繁琐。这里介绍一个自己封装的一个简单的基于Windows Socket的一个框架代码,主要目的是为了方便使用Windows Socket进行编程时的代码复用,闲话少说,上代码。 熟悉Windows Socket的都知道进行Windows网络
Florian
2018/02/05
1.7K0
一个简单的Windows Socket可复用框架
一文学会 | linux socket编程----TCP
TCP 是基于连接的数据流的协议,先建立连接再进行通信,而且在通信过程中会检查数据是否发送成功。优点就是保证数据的完整性和准确性,缺点就是效率较低。
混说Linux
2022/07/14
3740
一文学会 | linux socket编程----TCP
网络编程第三讲UDP编写
  UDP是面向无连接的.就是说数据传输会丢掉.网络延时比较大的情况下.会早上丢包.例如视频通话.就是UDP
IBinary
2019/05/25
4480
【Linux】:Socket编程 TCP
在上篇文章里面已经讲了关于 Socket UDP 网络编程的内容,这篇文章我们主要是关于 Socket TCP 网络编程的内容
IsLand1314
2025/01/20
3890
【Linux】:Socket编程 TCP
【Linux】Socket编程—TCP
  下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。
大耳朵土土垚
2025/02/15
3480
【Linux】Socket编程—TCP
14.1 Socket 套接字编程入门
Winsock是Windows操作系统上的套接字API,用于在网络上进行数据通信。套接字通信是一种允许应用程序在计算机网络上进行实时数据交换的技术。通过使用Windows提供的API,应用程序可以创建一个套接字来进行数据通信。这个套接字可以绑定到一个端口,以允许其他应用程序连接它。另外,Winsock可以使用TCP/IP、UDP等协议来完成不同类型的数据传输任务。在网络应用程序开发中,套接字通信可以帮助应用程序开发者实现客户端/服务端模型,并实现数据的可靠传输。
王瑞MVP
2023/10/11
4630
14.1 Socket 套接字编程入门
UNPv13:#第5章#TCP客户/服务器程序示例
Code github //server.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <signal.h> #include <wait.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> void sig_chld(int signo)
_gongluck
2018/03/09
7570
监测网络状态(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
day01-从一个基础的socket服务说起
在linux中,一切都是文件,所有文件都有一个int类型的编号,称为文件描述符。服务端和客户端通信本质是在各自机器上创建一个文件,称为socket(套接字),然后对该socket文件进行读写。
会玩code
2022/04/24
1.3K2
day01-从一个基础的socket服务说起
C++ 使用Socket实现主机间的UDP/TCP通信
服务器端的代码做了跨平台(POSIX和WINDOWS),基于POSIX平台(Linux、Mac OS X、PlayStation等)使用sys/socket.h库,windows平台使用winsock2.h库。 客户端代码因为基本都在windows运行,所以没做跨平台,需要的话你可以参考服务器端代码自己做一下。 文中写的函数原型均为windows平台,部分函数的返回类型或参数类型在POSIX会有不同。
六月丶
2023/01/01
3.1K0
C++ 使用Socket实现主机间的UDP/TCP通信
【Linux网络#17】TCP全连接队列与tcpdump抓包
此时启动 1 个客户端同时连接服务器, 用 netstat 查看服务器状态, 一切正常,如下:
IsLand1314
2025/05/06
590
【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
5030
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
8710
深入剖析Linux网络设计中网络IO的重要角色
网络编程主要关注四个问题:连接的建立、断开连接、消息到达、消息发送。 不管使用什么样的网络模型,不管使用的是阻塞IO还是非阻塞IO,不管是同步IO还是异步IO,都需要关注这四个问题。
Lion 莱恩呀
2024/08/17
2140
深入剖析Linux网络设计中网络IO的重要角色
相关推荐
【socket笔记】TCP、UDP通信总结
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验