【linux】TCP网络编程及Web服务器搭建

embedded/2024/11/17 22:18:43/

一、TCP客户端编程

1、TCP的概述

客户端:主动连接服务器、和服务器进行通信

服务器:被动被客户端连接,启动新的线程或进程 服务器客户端(并发服务器)

2、创建TCP套接字 

int sockfd = socket(AF_INET, SOCK_STREAM, 0); 

socket函数创建的TCP套接字,没有端口,默认为主动连接特性 

3、调用connect函数连接服务器

        tcp客户端通信之前 必须事先 建立和服务器的连接 

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

addr地址结构体 存放的是服务器的IP、PORT 返回值:成功为0 失败-

//连接服务器
struct sockaddr_in ser_addr;
bzero(&ser_addr, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(8000);
ser_addr.sin_addr.s_addr = inet_addr("10.9.11.251");
connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));

 如果sockfd没有固定端口 在调用connect时系统自动分配随机端口为源端口

4、send发送消息 

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

sockfd:套接字

buf:需要发送的字符串的首元素地址

len:需要发送的字符串的实际长度

flags:默认为0

成功返回实际发送的字节数,失败返回-1

注意:TCP并不能发送0长度报文,但是UDP可以

 5、recv接收消息(默认阻塞)

#include <sys/types.h>

#include<sys/socket.h>

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

sockfd:套接字

buf:存放收到的消息

len:最大能接收的长度

flags:默认为0  

成功返回收到的实际字节数, 失败返回-1

recv如果收到0长度报文,表明对方已经断开连接。

 close(sockfd);断开连接

6、tcp客户端 收发数据

cilent.c

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>int main(int argc, char const *argv[])
{//创建TCP套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket");return 0;}printf("sockfd = %d\n", sockfd);//连接服务器struct sockaddr_in ser_addr;bzero(&ser_addr, sizeof(ser_addr));ser_addr.sin_family = AF_INET;ser_addr.sin_port = htons(8082);ser_addr.sin_addr.s_addr = inet_addr("192.168.172.179");connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));//send发送数据send(sockfd, "hello tcp", strlen("hello tcp"), 0);//recv接收数据unsigned char buf[1500] = "";int len = recv(sockfd, buf, sizeof(buf), 0);printf("len=%d buf=%s\n", len, buf);//关闭套接字close(sockfd);return 0;
}

 NetAssist充当服务器:

 二、TCP服务器编程

1、作为服务器的条件 

  1. 需要bind函数 为服务器绑定固定的端口、IP
  2. 使用listen函数 让服务器套接字 由主动变被动
  3. 等待客户端的连接到来 accept提取到来的客户端。 

 2、listen 监听函数

  • #include<sys/types.h> /* See NOTES */
  • #include<sys/socket.h>
  • int listen(int sockfd,

http://www.ppmy.cn/embedded/138363.html

相关文章

鸿蒙HarmonyOS 地图不显示解决方案

基于地图的开发准备已完成的情况下&#xff0c;地图还不显式的问题 首先要获取设备uuid 获取设备uuid 安装DevEco Studio的路径下 有集成好的hdc工具 E:\install_tools\DevEco Studio\sdk\default\openharmony\toolchains 这个路径下打开cmd运行 进入“设置 > 关于手机…

uniapp中多角色导致tabbar过多的解决方式

由于项目时间较紧张&#xff0c;找了很多却没找到特别合适的方法&#xff0c;最后使用了此方式。 一、自己封装tabbar组件 这里就不介绍怎么封装了&#xff0c;先说一下缺点&#xff1a; 1.跳转会有白屏问题&#xff08;并且搜了好多资料以及查看官网发现没有特别合适的方法…

分享 | 中望3D 2025发布会提及的工业数字化MBD是什么?

本文为CAD芯智库原创&#xff0c;未经允许请勿复制、转载&#xff01; 原文转自&#xff1a;www.xwzsoft.com/h-nd-487.html 今年中望CAD/中望3D 2025版新品发布会上&#xff0c;中望产品规划与GTM中心总监胡其登先生的专题演讲——《基于模型的CAx一体化研发管理平台&#xff…

正则表达式常用字符

基础正则 ^:开头字符 $:结尾字符 ^$:空行 .:任意一个字符 *:前一个字符连续出现0次或以上 .*:所有 []&#xff1a;括号中的任意一个字符 [a-z] [a-zA-Z0-9] [a-zA-Z0-9] [^]:除括号内以外的字符 扩展正则 |:或 ssh|telnet|http ():表示整体 ^(ssh|telnet|http)^ssh|^telnet|^ht…

ranger-kms安装

默认已安装ranger-admin和mysql服务。Ranger组件服务默认都在/opt/bigdata.test/core/ranger目录下安装。 解压安装包 [hadoop~]$ cd /opt/ranger [hadoop ranger]$ tar -xzvf ranger-2.1.0-kms.tar.gz [hadoopx ranger]$ mv ranger-2.1.0-kms ranger/ranger-kms 修改instal…

【LeetCode】每日一题 2024_11_15 最少翻转次数使二进制矩阵回文 I(模拟、矩阵遍历(竖着遍历))

前言 每天和你一起刷 LeetCode 每日一题~ 决定在前言里面加上新内容&#xff01;新增模块&#xff1a;“本期看点” 本期看点&#xff1a;如何竖着遍历矩阵&#xff1f; LeetCode 启动&#xff01; 题目&#xff1a;最少翻转次数使二进制矩阵回文 I 代码与解题思路 先读题…

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速&#xff0c;数据中心网络正在迅速发展以跟上步伐。对于许多企业来说&#xff0c;400GbE 甚至 800GbE 正在成为标准选择&#xff0c;因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

【CubeMX-HAL库】STM32H743II——SDRAM配置所遇问题

使用FMC访问外部地址时&#xff0c;必须配置MPU(内存保护单元)&#xff01; 推荐的博客和视频&#xff1a; 1、【CubeMX-HAL库】STM32H743—FMC配置SDRAM_stm32h743 sdram 速度-CSDN博客 2、【【STM32CubeMX教程】STM32全外设原理、配置和常用HAL、LL库API使用详解】 3、在…