linux socket tcp 为什么老是是accept error : Bad file descriptor
/*server.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <strings.h>
#include <pthread.h>
#define SERVPORT 1620 /* server listen port */
#define BACKLOG 20 /* max number of linking at a time */
#define BUF 100
int main()
{
void* tcp_thread (void* );
int sockfd,client_fd; /*sock_fd:listen socket;client_fd:data transport socket */
int on=1;
struct sockaddr_in my_addr; /* information of server address */
struct sockaddr_in remote_addr;/* information of client address */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)/* socket create */
{
perror( "socker create error\n ");
return 0;
}
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(void *)&on,sizeof(int));
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) //bind
{
perror( "bind error\n ");
return 0;
}
if (listen(sockfd, BACKLOG) < 0) //listen
{
perror( "listen error\n ");
return 0;
}
printf( "sockfd:%d\n ", sockfd);
while(1)
{
int sin_size = sizeof(struct sockaddr);
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,(socklen_t*)&sin_size)) < 0)
{
perror( "accept error\n ");
continue;
}
printf( "client_fd:%d\n ",client_fd);
char ptr[32];
inet_ntop(AF_INET,(void *)&remote_addr.sin_addr,ptr,32);
printf( "received a connection from %s\n ", ptr);
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); /* the attribute of the thread */
pthread_create(&thread_id,&attr,tcp_thread,(void *)client_fd);
pthread_attr_destroy(&attr);
}
return 1;
}
void* tcp_thread (void* fd) //thread for a client link
{
int newfd = (int)fd;
printf( "newfd:%d\n ",newfd);
while (1)
{
fd_set rfds;
FD_ZERO( &rfds);
FD_SET(newfd, &rfds);
select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
if (FD_ISSET(newfd, &rfds))
{
FD_CLR(newfd, &rfds);
char data[BUF];
memset(data, '\0', sizeof(data));
int res = read(newfd, data, sizeof(data));
printf( "the mes is %d\n ",res);
if (res < 0)
{
perror( "Communication error\n ");
return NULL;
}
else if(res == 0)
{
printf( "Communication end\n ");
shutdown(newfd,SHUT_RDWR);
return NULL;
}
else
{
printf( "date:%s\n ",data);
}
}
else
{
continue;
}
}
}
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <strings.h>
#include <netdb.h>
#include <pthread.h>
#define BUF 100
void* pthfunction (void* fd) //thread for a client link
{
int newfd = (int)fd;
printf( "newfd:%d\n ",newfd);//new pthread fd
while (1)
{
fd_set rfds;
FD_ZERO( &rfds);
FD_SET(newfd, &rfds);
select(FD_SETSIZE, &rfds, NULL, NULL, NULL);
if (FD_ISSET(newfd, &rfds))
{
FD_CLR(newfd, &rfds);
char data[BUF];
scanf( "%s ",data);
memset(data, '\0', sizeof(data));//clean 0
int res = write(newfd,data,strlen(data));
printf( "the mes is %d\n ",res);
if (res < 0) //fail
{
perror( "Communication error\n ");
return NULL;
}
else if(res == 0) //interrupt
{
printf( "Communication end\n ");
shutdown(newfd,SHUT_RDWR);
return NULL;
}
else //success
{
printf( "date:%s\n ",data);
}
}
else
{
continue;
}
}
}
int main (int argc,char *argv[])
{
if (argc < 2)
{
perror( "Please enter the server 's hostname!\n ");
exit(1);
}
int fid = socket(AF_INET, SOCK_STREAM, 0);
if(fid == -1)
{
perror( "socket error!\n ");
exit(1);
}
struct sockaddr_in their_addr;
struct hostent *host;
if((host = gethostbyname(argv[1])) == NULL)
{
perror( "gethostbyname error!\n ");
exit(1);
}
bzero(&their_addr,sizeof(their_addr));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(1620);
their_addr.sin_addr = *((struct in_addr *)host-> h_addr);
if(connect(fid,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
{
printf( "connect error\n ");
exit(1);
}
while(1)
{
int len_clt,sendfd;
len_clt = sizeof(their_addr);
if((sendfd = accept(&fid,(struct sockaddr *)&their_addr,(socklen_t*)&len_clt)) == -1)
{
perror( "accept error\n ");
exit(1);
}
pthread_t thread_id;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // the attribute of the thread
pthread_create(&thread_id,&attr,pthfunction,(void *)sendfd);
pthread_attr_destroy(&attr);
// write(fid,data,strlen(data));
//create a pthread to send message to server
}
return 1;
}
相关推荐
【带状电容器计算用于电容式触摸传感器应用】半数值模型的电容式触摸传感器集成于金属基材涂层中研究(Matlab代码实现)
内容概要:本文针对电容式触摸传感器在金属基材上应用时易受干扰导致信号衰减的问题,提出一种集成于金属基材涂层中的带状电容器半数值计算模型。通过理论推导建立传感器电容的数学模型,设定合理的边界条件并采用数值方法求解,利用Matlab实现完整的仿真代码,对传感器在金属背景下的电容特性进行精确建模与性能分析。该方法有效提升了传感器的灵敏度与抗干扰能力,适用于高精度、复杂环境下的触摸感应场景,具有良好的工程应用价值。研究不仅提供了详细的建模流程与仿真验证,还开放了可复现的代码资源,便于后续优化与拓展。; 适合人群:从事电容式传感器设计、嵌入式系统开发、人机交互技术研究及相关领域的科研人员,以及具备电磁场理论基础和Matlab编程能力的硕士、博士研究生;; 使用场景及目标:①用于金属表面电容式触摸传感系统的建模与性能优化;②为抗金属干扰传感器提供有效的半数值仿真方法与技术支撑;③辅助高校科研与教学中对电容耦合机制的理解及仿真平台搭建; 阅读建议:建议结合Matlab代码逐模块调试,深入理解模型中几何参数、材料属性及边界条件对电容输出的影响规律,可进一步推广至其他复杂结构或非理想环境下的传感器设计中。
(Multisim课设资料)最全面函数信号发生器(三角波+正弦波+方波信号+锯齿波仿真设计+报告文档
内容概要:本文档是一份综合性科研技术资源汇总,系统梳理了工程与计算机科学领域的多项关键技术及其实现方法,涵盖图像处理、路径规划、无人机应用、通信技术、信号处理、电力系统优化、车间调度、雷达技术、微电网与综合能源系统调度等多个前沿方向。文档重点提供了基于Matlab和Simulink的丰富仿真案例,包括裂纹检测、双目视觉体积测量、卡尔曼滤波状态估计、永磁同步电机控制、无功优化、多目标调度算法(如NSGA-II、粒子群算法)在能源与交通系统中的应用,以及遗传算法、差分进化、人工蜂群等智能优化算法的代码实现。资源强调理论与实践深度融合,配套完整的仿真模型、算法代码与实验结果,具有较强的工程复现价值和科研指导意义。; 适合人群:具备一定编程基础的研究生、科研人员及从事自动化、电气工程、控制工程、通信、人工智能等相关领域工作的技术人员,尤其适合有1-3年工作经验的研发人员。; 使用场景及目标:①用于高校课程设计、毕业设计、科研项目开发和技术复现;②支撑电力系统优化、智能制造调度、智能交通路径规划、无人机控制等实际工程问题的算法研究与仿真验证;③帮助读者掌握主流优化算法与信号处理技术的核心原理与代码实现。; 阅读建议:建议读者结合文中提供的Matlab/Simulink代码与仿真模型进行实践操作,优先选择与自身研究方向相关的主题深入学习,并参考所提供的网盘链接获取完整资源以辅助调试与复现实验结果。
BMS保护板原理图+PCB+固件源码+bin文件+上位机
BMS保护板原理图+PCB+固件源码+bin文件+上位机 单片机是STM32F303CCT6 1、带有软电源开关输入,带 LED (LOAD) 开/关 + 充电指示灯; 2、具有高压侧电源开关,控制通断; 3、隔离式 CAN 总线接口; 4、电流测量; 5、带有短路检测; 6、带有USB 接口通信和固件升级; 7、蜂鸣器指示错误状态; 8、体积小巧; 9、短时间最大负载电流+/- 100A,长时间约为70A; 10、最大充电电流 10A(带二极管)或 30A(带二极管旁路); 11、电池电压范围为 2.5V 至 4.5V; 12、包电压 12V 至 54V;
无刷直流电机BLDC无感+滑模观测器+转速电流双闭环PI控制(总共三个仿真模型)(Simulink仿真实现)
内容概要:本文档系统阐述了无刷直流电机(BLDC)在无位置传感器条件下的高性能控制策略,基于Simulink平台构建了三个相互关联的仿真模型,重点实现无感控制与滑模观测器(Sliding Mode Observer, SMO)相结合的转速电流双闭环PI控制系统。该资源摒弃了传统的霍尔传感器,利用滑模观测器实时估算转子的位置与转速信息,有效降低了系统成本并提升了在恶劣环境下的运行可靠性。仿真模型完整涵盖了逆变电路、空间矢量脉宽调制(SVPWM)、三相电流采样、坐标变换(Clark & Park)、PI调节器以及滑模观测器等核心模块,形成了一个闭环的、高动态响应的电机驱动系统。此外,文档还集成了模糊PID、传统PID等多种控制算法的对比仿真模型,便于研究者深入分析不同控制策略在动态响应、抗干扰能力和稳态精度方面的性能差异,为电机控制算法的研究与工程化应用提供了坚实的仿真验证基础。; 适合人群:具备自动控制理论、电机拖动原理及电力电子技术基础知识,并熟悉MATLAB/Simulink软件操作的电气工程、自动化、机电一体化等专业的高年级本科生、硕士研究生,以及从事电机驱动、新能源汽车、工业自动化等领域的研发工程师和技术人员。; 使用场景及目标:①深入学习和掌握无刷直流电机无位置传感器控制的基本原理与实现方法;②系统性地理解滑模观测器的设计思想、稳定性分析及其在转子位置与速度估计中的关键技术;③对比研究传统PI控制、模糊PID控制及滑模观测器在BLDC调速系统中的综合性能,分析其在不同工况下的鲁棒性与适应性;④为毕业设计、科研课题或工业项目中的电机控制系统开发提供可复用的仿真平台与技术参考。; 阅读建议:本资源以Simulink仿真为核心载体,建议使用者结合文档中提供的详细说明报告与参考文献,循序渐进地理解各功能模块的设计逻辑与参数整定方法。在学习过程中,务必动手运行并调试仿真模型,仔细观察并记录在不同负载突变、转速指令变化等工况下,电机的三相电流、转速响应曲线及滑模观测器输出的转子位置与速度的动态波形,从而深刻理解控制算法的内在机理。为进一步提升实践与创新能力,可尝试修改控制器参数(如PI增益、滑模增益),或替换不同的控制策略进行对比实验,探究其对系统性能的影响。
基于UC3842的反激式开关电源Multisin仿真设计【仿真+原理说明+参考文档】
内容概要:本文系统阐述了基于UC3842电流模式PWM控制器的反激式开关电源在Multisim环境中的完整仿真设计过程。围绕小功率隔离型直流电源的设计需求,深入剖析反激拓扑与电流模式控制的协同工作机制,构建了包含启动电路、高频变压器、RCD钳位网络、TL431与光耦构成的隔离反馈环路以及UC3842核心控制芯片的完整仿真模型。重点对电源的启动特性、辅助供电建立、变压器初级电流与电压波形、反馈环路的稳定性、以及UC3842的逐周期峰值电流限制和在负载突变、输出短路等异常工况下的“打嗝”式保护行为进行了详尽的仿真分析与验证,充分论证了该设计方案的可行性与工程可靠性。; 适合人群:具备模拟电子技术、电力电子技术及开关电源基础知识,从事电源产品开发、电力电子系统设计的工程师、高等院校电气工程及相关专业的师生及科研人员。; 使用场景及目标:①深入学习和掌握基于UC3842的反激式开关电源的核心设计原理、电路拓扑构建与Multisim仿真方法;②透彻理解电流模式控制、变压器参数设计与匹配、隔离反馈环路补偿设计、RCD吸收网络优化以及过流保护等关键技术的实现细节与工程考量;③为实际硬件电路的研发、调试与优化提供精确的前期仿真验证、理论支撑和设计指导。; 阅读建议:建议读者结合Multisim软件进行动手实践,严格按照文中所述的结构与参数逐步搭建电路,通过示波器、探针等工具仔细观测并分析关键节点的电压与电流波形,重点关注系统在不同负载条件下的动态响应与稳定性表现,并充分利用所提供的完整仿真文件、原理说明与参考文档进行对比学习与深入探究。



