为什么在这个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
...全文
250 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代码实现,旨在提升智能楼宇在复杂能源环境下的运行效率与经济性。研究充分考虑光伏出力、负荷需求等不确定性因素,引入多维核密度估计、场景生成与削减等技术进行不确定性建模,并融合需求响应、微电网调度等先进理念,实现了对综合能源系统中储能资源的高效配置与动态调控,具有较强的理论深度与工程应用价值。; 适合人群:具备电力系统、可再生能源、优化算法或综合能源系统等相关背景,从事科研、工程应用或课题研究的研发人员、研究生及高年级本科生。; 使用场景及目标:①应用于智能楼宇、园区微电网、虚拟电厂等场景中的储能规划与运行优化;②支撑高水平学术论文(如EI/SCI)的复现、课题申报、毕业设计及实际项目的双层优化建模与求解实践。; 阅读建议:建议结合提供的Matlab代码进行实操演练,重点理解双层优化架构的设计逻辑、求解策略(如Benders分解、主从博弈等)及不确定性处理方法,同时可参考文中关联技术(如场景生成、需求响应)拓展研究思路与应用场景。

70,039

社区成员

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

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