为什么在这个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
...全文
175 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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;
    }

70,020

社区成员

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

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