为什么accept总失败

ToWhere 2013-08-23 03:23:42
刚学习unix网络编程,为什么accept总失败,求指点
#include <stdio.h>
#include <netinet/in.h> //定义的所有INADDR_的常量都是主机字节序
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <stdlib.h>
#include <errno.h>

void str_echo(int sockfd);
int main() {
int sockfd, connfd;
socklen_t chilen;
pid_t childpid;
struct sockaddr_in servaddr,cliaddr;

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)
printf("erro\n");
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8888);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPv4通配地址,一般为0
int ret = bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));//bind成功返回0,失败返回-1
if(ret < 0)
printf("error...\n");

listen(sockfd, 5);//完成队列和未完成队列
int clilen = sizeof(cliaddr);
for(;;) {
connfd = accept(sockfd,(struct sockaddr*)&cliaddr,&clilen );//第二个参数返回取得的客户端的协议地址和端口
if(connfd < 0)//若成功返回非负描述符,出错则为1
printf("accept error!!!\n");


if( (childpid = fork())== 0) {
/*
获得客户端的ip地址和端口
*/
char buf[1000];
printf("connection from %s, port %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr, buf,sizeof(buf)),ntohs(cliaddr.sin_port));

close(sockfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
return 0;
}


void str_echo(int sockfd) {
int n;
char buf[100];
again:
while((n = read(sockfd, buf ,100))>0) //服务器读入数据,并把它们回射给客户,注意read和write的参数都是sockfd
write(sockfd, buf, n);
if( n<0&& errno == EINTR)
goto again;
else if(n<0)
printf("read error");
}
...全文
428 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
大漠孤鸿 2013-08-23
  • 打赏
  • 举报
回复
引用 11 楼 love1314sea 的回复:
[quote=引用 4 楼 liyanfasd 的回复:] 不一定是accept出错了。
if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)
printf("erro\n");
修改为:
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
printf("erro\n");
运算符“<”优先级高于运算符“=”。
多谢,我修改了下,能运行了,谢谢。 你是怎么发现的啊[/quote] 新手的话,你就打印套接字描述符,观察一下。 平时养成写代码的规范就行了。
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 4 楼 liyanfasd 的回复:
不一定是accept出错了。
if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)
printf("erro\n");
修改为:
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
printf("erro\n");
运算符“<”优先级高于运算符“=”。
多谢,我修改了下,能运行了,谢谢。 你是怎么发现的啊
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 9 楼 love1314sea 的回复:
[quote=引用 8 楼 max_min_ 的回复:] [quote=引用 7 楼 love1314sea 的回复:] [quote=引用 6 楼 max_min_ 的回复:] [quote=引用 5 楼 love1314sea 的回复:] [quote=引用 3 楼 max_min_ 的回复:]

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。[/quote] 结贴吧![/quote] 你是怎么找出来的啊[/quote] 帮你找问题找这么久, 你竟然不给分我[/quote] 我不是给了吗?。。。 [/quote] 不好意思,我看错了,引用错了。不是这里的问题,4楼找到了问题,可以运行下
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 8 楼 max_min_ 的回复:
[quote=引用 7 楼 love1314sea 的回复:] [quote=引用 6 楼 max_min_ 的回复:] [quote=引用 5 楼 love1314sea 的回复:] [quote=引用 3 楼 max_min_ 的回复:]

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。[/quote] 结贴吧![/quote] 你是怎么找出来的啊[/quote] 帮你找问题找这么久, 你竟然不给分我[/quote] 我不是给了吗?。。。
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
引用 7 楼 love1314sea 的回复:
[quote=引用 6 楼 max_min_ 的回复:] [quote=引用 5 楼 love1314sea 的回复:] [quote=引用 3 楼 max_min_ 的回复:]

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。[/quote] 结贴吧![/quote] 你是怎么找出来的啊[/quote] 帮你找问题找这么久, 你竟然不给分我
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 6 楼 max_min_ 的回复:
[quote=引用 5 楼 love1314sea 的回复:] [quote=引用 3 楼 max_min_ 的回复:]

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。[/quote] 结贴吧![/quote] 你是怎么找出来的啊
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
引用 5 楼 love1314sea 的回复:
[quote=引用 3 楼 max_min_ 的回复:]

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。[/quote] 结贴吧!
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
太感谢了,是这里的问题。
大漠孤鸿 2013-08-23
  • 打赏
  • 举报
回复
不一定是accept出错了。
if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)
printf("erro\n");
修改为:
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
printf("erro\n");
运算符“<”优先级高于运算符“=”。
max_min_ 2013-08-23
  • 打赏
  • 举报
回复

if(sockfd = socket(AF_INET, SOCK_STREAM, 0)<0)

//改成 ,这错误,写代码多注意点小问题
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
ToWhere 2013-08-23
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:


int clilen = sizeof(cliaddr);

//上面的这句改成下面的
socklen_t clilen = sizeof(cliaddr);
还是不行啊
max_min_ 2013-08-23
  • 打赏
  • 举报
回复


int clilen = sizeof(cliaddr);

//上面的这句改成下面的
socklen_t clilen = sizeof(cliaddr);

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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