为什么在这个socket上accpet出错呢?分数不够,明天加分

雷格 2013-04-16 06:39:57
我先在一个函数中创建一个套接字,并让其处于listen状态。然后返回这个套接字的描述符。
然后在main函数中就直接在这个套接字描述符上accept。这样有什么问题吗?为什么accept老出错。perror输出的信息是参数无效。

int listenfd = listen_socket(ip.s_addr,100);
if(-1 == listenfd)
{
print_error_location();
return -1;
}
//print addr
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
bzero(&addr,addrlen);
if(-1 == getsockname(listenfd,(struct sockaddr*)&addr,&addrlen))
{
print_error_location();
return -1;
}
printf("ip addr is :%s,port:%d\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));

//accept a connect requset
while(1)
{
int acceptfd = accept(listenfd,NULL,NULL);//acceptfd的值老为-1,这是为啥?
//如果是listenfd的值无效,那上面的getsockname为什么会调用成功?
if(-1 == acceptfd)
{
print_error_location();
perror("accept wrong!\n");
continue;
}
//create a thread to recv file from client
pthread_t tid;
PAR_TO_THREAD *p = (PAR_TO_THREAD*)malloc(sizeof(PAR_TO_THREAD));
int err = pthread_create(&tid,NULL,file_recv,(void*)p);
if(0 != err)
{
perror("create thread faild\n");
continue;
}

}



//另一文件中
#include "mysocket.h"
int listen_socket(in_addr_t ip,int backlog)
{
int listenfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == listenfd)
{
print_error_location();
perror("tcpServerSocket: create socket error!");
return -1;
}
//bind ip,let sys choose a port for us.
struct sockaddr_in addr;
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ip;
if(-1 == bind(listenfd,(struct sockaddr*)&addr,sizeof(addr)))
//listen...
if(listen(listenfd,backlog) == -1)
{
print_error_location();
perror("tcpServerSocket: listen error");
return -1;
}
return listenfd;
}



我单步跟踪的结果表示man函数中的listenfd的值一直没变,为啥就不能在上面accept呢?
输出结果是:
ip addr is :192.168.1.222,port:42733
-->myerror.h,print_error_location,7,accept wrong!
: Invalid argument
...全文
261 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
YunXia98Li 2013-04-17
  • 打赏
  • 举报
回复
这有socket例子,可以参考: http://download.csdn.net/detail/geoff08zhang/4571358
无间虚者 2013-04-17
  • 打赏
  • 举报
回复
唉,总会出现这样的错误。。。lz加油。。。
雷格 2013-04-17
  • 打赏
  • 举报
回复

if(-1 == bind(listenfd,(struct sockaddr*)&addr,sizeof(addr)))
    //listen...原来是我不小心把if(-1==bind(...))的处理代码给删掉了,悲剧啊,浪费我一下午
    if(listen(listenfd,backlog) == -1)   
    {
        print_error_location();
        perror("tcpServerSocket: listen error");
        return -1;
    }
内容概要:本文围绕“基于雅可比伪逆迭代的双臂协同轨迹规划与跟踪误差收敛性研究”展开,系统探讨了利用雅可比矩阵伪逆法实现双机械臂协同运动的轨迹规划方法,并通过Matlab代码实现了对系统跟踪误差收敛性的仿真验证。研究内容涵盖双臂协同的动力学建模、雅可比伪逆算法的迭代求解机制、轨迹跟踪控制器的设计,以及跟踪误差收敛性的数学证明与数值仿真分析,旨在提升多机械臂系统在复杂协作任务中的运动协调性、轨迹跟踪精度与控制稳定性。; 适合人群:具备机器人学、自动控制理论及数值计算基础,熟悉Matlab/Simulink仿真环境,从事多机械臂协同控制、轨迹规划算法开发及相关方向的研究生、科研人员或工程技术人员。; 使用场景及目标:①研究双机械臂系统在协同作业中的运动规划与控制策略;②掌握雅可比伪逆法在冗余自由度机器人运动学求解中的应用原理;③实现并验证轨迹规划算法的仿真性能与误差收敛特性;④为工业装配、协作搬运、精密操作等多臂机器人应用场景提供算法支持与技术参考。; 阅读建议:建议读者结合Matlab代码逐模块分析算法实现细节,重点关注雅可比矩阵的构建方法、伪逆求解过程及其在迭代控制中的应用机制,同时通过仿真结果对比分析不同参数对系统收敛性与跟踪精度的影响,宜在实际调试中调整增益参数与初始条件以深化对控制性能的理解。

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧