为什么会提示Connection refused啊?

ww884203 2012-05-16 09:20:23
刚刚开始看《UNIX网络编程》,就尝试了一下第一章的获取时间的程序,使用环回地址运行或者查看ifconfig里面的IPv4地址都得到的结果是connect error: Connection refused,请问是什么原因?
如果尝试ping 127.0.0.1的话则没有任何问题。
代码如下;
服务器端

#include "unp.h"
#include <time.h>

int main(int argc , char ** argv)
{
int listenfd , connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;

listenfd = socket(AF_INET , SOCK_STREAM , 0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(13);

bind(listenfd , (SA *)&servaddr , sizeof(servaddr));
listen(listenfd , LISTENQ);

while(1)
{
connfd = accept(listenfd , (SA *)NULL , NULL);
ticks = time(NULL);
snprintf(buff , sizeof(buff) , "%.24s\r\n",ctime(&ticks));
write(connfd , buff , strlen(buff));
close(connfd);
}
return 0;
}

客户端:

#include "unp.h"

int main(int argc , char ** argv)
{
int sockfd , n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;

if(argc != 2)
{
err_quit("usage: a.out <IPaddress>");
}
if( (sockfd = socket(AF_INET , SOCK_STREAM , 0) ) < 0)
{
err_sys("socket error");
}
bzero(&servaddr , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13);
if(inet_pton(AF_INET , argv[1] , &servaddr.sin_addr) <= 0)
{
err_quit("inet_pton error for %s",argv[1]);
}
if(connect(sockfd , (SA*)&servaddr , sizeof(servaddr)) < 0)
{
err_sys("connect error");
}
while( ( n = read(sockfd , recvline , MAXLINE)) > 0)
{
recvline[n] = 0;
if(fputs(recvline , stdout) == EOF)
{
err_sys("fputs error");
}
}
if(n < 0)
{
err_sys("fputs error");
}
return 0;
}
...全文
3135 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

发现问题的原因了,端口号13是保留端口所以bind调用失败,换了一个端口为5050就可以了。。
[/Quote]

root启动的话不存在这个问题,13端口也没有系统服务运行,问题如我所说,记得永远在服务端设置端口复用。
qq120848369 2012-05-16
  • 打赏
  • 举报
回复

服务端int on = 1; setsockopt(SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

其实你的服务端第二次就再也启动不起来了,端口还在TIMEWAIT呢。
ww884203 2012-05-16
  • 打赏
  • 举报
回复
发现问题的原因了,端口号13是保留端口所以bind调用失败,换了一个端口为5050就可以了。。
ww884203 2012-05-16
  • 打赏
  • 举报
回复
发现bind的返回值是-1 。。。。。。看来为了省事默认函数调用成功是行不通的啊
ww884203 2012-05-16
  • 打赏
  • 举报
回复
我再把服务器端的调用返回值都查看一下,看有没有出现错误

64,646

社区成员

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

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