当前位置: 首页 > news >正文

Linux网络编程socket服务器端模拟实现

TCP通信流程分析:
server 服务器端主要流程
socket(),创建socket套接字
bind(),绑定ip和端口
listen(),设置监听上限,不是用来监听的
accept(),阻塞客户端监听连接
用转换大小写字符串为例子

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>

#define SERV_PORT 9527

void sys_err(char* str)
{
    perror(str);
    exit(1);
}

int main(int argc,char* argv[])
{
    int lfd = 0,cfd = 0;
    int ret_bind;
    int ret_listen;
    int ret_accept;
    int ret_read;
    char buf[BUFSIZ];
    socklen_t clit_addr_len;
    struct sockaddr_in serv_addr,clit_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERV_PORT);
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1)
    {
        sys_err("socket error");
    }
    ret_bind = bind(lfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    if(ret_bind == -1)
    {
        sys_err("bind error");
    }
    ret_listen = listen(lfd,128); //The default maximum value is 128
    clit_addr_len = sizeof(clit_addr);
    ret_accept = accept(lfd,(struct sockaddr*)&clit_addr,&clit_addr_len);
    if(ret_accept == -1)
    {
        sys_err("accept error");
    }

    while(1)
    {
        ret_read = read(ret_accept,buf,sizeof(buf));
        write(STDOUT_FILENO,buf,ret_read);
        for(int i = 0;i < ret_read;i++)
        {
            buf[i] = toupper(buf[i]);
        }
        write(ret_accept,buf,ret_read);
    } 
    
    close(lfd);
    close(ret_accept);

    return 0;
}

当程序运行时将在端口堵塞,如图下
在这里插入图片描述
此时打开另一个端口,用nc命令连接服务器,输入hello,会返回HELLO,如图
在这里插入图片描述

http://www.dtcms.com/a/106337.html

相关文章:

  • JSP 指令
  • Python数据类型-dict
  • 第八届 蓝桥杯 嵌入式 省赛
  • 【ESP32-IDF 笔记】02-LED PWM 配置
  • 运维面试题(ORACLE数据库)--20250401
  • Cesium学习(未完继续)
  • 题解:AT_arc050_c [ARC050C] LCM 111
  • Android的安全问题 - 在 Android 源码的 system/sepolicy 目录中,区分 public、private 和 vendor的目的
  • Kotlin 作用域函数:apply、let、run、with、also
  • 掩码图像建模 (MIM) 中的对数似然与交叉熵
  • 品铂科技与宇都通讯UWB技术核心区别对比(2025年)
  • C++:位图和布隆过滤器
  • spring-ai-alibaba第三章ollama集成Tool
  • 【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解
  • ERP管理系统:Java+Vue,含源码及文档,一体化管理资源,优化流程,强化企业运营效率
  • React.memo()和 useMemo()的用法是什么,有哪些区别
  • CSS3学习教程,从入门到精通,CSS3 媒体查询实现响应式布局语法指南(21)
  • Unity插件SuperScrollView详解(基础篇)
  • Redis安全与配置问题——AOF文件损坏问题及解决方案
  • 机器人--ros2--IMU
  • 用jQuery和Canvas打造2D版“我的世界+超级玛丽“游戏
  • 知名界面控件DevExpress v24.2.6全新可用|发布重要更改
  • 安卓一些接口使用
  • dbgpt7.0 docker部署
  • Unity工具—默认取消Image和RowImage的Raycast Target
  • Vue3入门
  • 智谱大模型(ChatGLM3)PyCharm的调试指南
  • AI大模型从0到1记录学习 day11
  • 三步构建企业级操作日志系统:Spring AOP + 自定义注解的优雅实践
  • Redis的一些高级指令