请教一下LINUX下的网口通信为什么在连接的时候总是提示connect refuse

qqxlt 2010-08-25 09:13:50
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

//#define DEST_IP "192.168.4.140"
#define DEST_IP "192.168.3.127"
#define TCPPORT 4001

#define TESTLEN 1024

char buf[TESTLEN];

int main()
{
int sfd, size, flag;
int i, len;
struct sockaddr_in des;
//int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
//struct sockaddr_in remote_addr; /* 客户端地址信息 */

printf("create socket......");
if ( (sfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
{
printf("fail [%d]\n", errno);
return 0;

} else
printf("OK\n");

bzero(&des,sizeof(struct sockaddr_in));
des.sin_addr.s_addr = INADDR_ANY;//inet_addr(DEST_IP);
des.sin_family = AF_INET;
des.sin_port = htons(TCPPORT);
size = sizeof(des);
//printf("size=%d",size);

printf("connect......");
if ( connect(sfd, (struct sockaddr*)&des, sizeof(struct sockaddr)) < 0 )
{
//printf("fail [%d]\n", errno);
//return 0;
perror("connect");
exit(1);
} else
printf("OK\n");
创建连接的时候是成功的,为什么在连接的时候就总是提示connect refuse 觉得设置没有么什么问题,大家有没有遇到这样的情况的,请教了
...全文
1079 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwunix 2010-08-27
  • 打赏
  • 举报
回复
是Server端没有收到连接请求。从你的Client端程序看,好像没有连接到你想要连接的服务。
qqxlt 2010-08-27
  • 打赏
  • 举报
回复
确实是端口没有打开的原因 我现在用了23端口CONNECT成功了 但是怎么上位机一运行连接端口就没有响应了呢?加了断点看是在在accept处执行等待了 这是为什么呢?
qqxlt 2010-08-27
  • 打赏
  • 举报
回复
好的我先试试,不行再请教
wwwunix 2010-08-27
  • 打赏
  • 举报
回复
修改这条语句
des.sin_addr.s_addr = INADDR_ANY;
把地址改成你的服务器的地址。
jessiefn 2010-08-27
  • 打赏
  • 举报
回复
des.sin_addr.s_addr = INADDR_ANY;//inet_addr(DEST_IP);
换换IP啊。。
qqxlt 2010-08-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

//#define DEST_IP "192.168.4.140"
#define DEST_IP "192.168.3.127"
#define TCPPORT 23

#define TESTLEN 16

char buf[TESTLEN];


#define MAXDATASIZE 100 // 每次最大数据传输量


int main()
{
int sfd, size, flag, recvbytes;
int i, len;
struct sockaddr_in des;
//int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
//struct sockaddr_in remote_addr; /* 客户端地址信息 */
char buf[MAXDATASIZE];

printf("create socket......");
if ( (sfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
{
printf("fail [%d]\n", errno);
return 0;

} else
printf("OK\n");

bzero(&des,sizeof(struct sockaddr_in));
des.sin_addr.s_addr = INADDR_ANY;//inet_addr(DEST_IP);
des.sin_family = AF_INET;
des.sin_port = htons(TCPPORT);
size = sizeof(des);
//printf("size=%d",size);

printf("connect......");
if ( connect(sfd, (struct sockaddr*)&des, sizeof(struct sockaddr)) < 0 )
{
//printf("fail [%d]\n", errno);
//return 0;
perror("connect");
exit(1);
} else
printf("OK\n");
flag = 1;
printf("ready to recv & write data\n");
do {
printf("1\n");
len = recv(sfd, buf, TESTLEN, 0);
printf("len=%d\n",len);
if ( len > 0 )
{
printf("2\n");
if ( send(sfd,buf,len,0) < 0 )
{
printf("3\n");
printf("socket send data fail [%d]\n", errno);
break;
}
for ( i=0; i<len; i++ )
{
if ( buf[i] == 'q' )
{
printf("receive 'q' and disconnect\n");
flag = 0;
}
}
}
else if ( len == 0 )
{
printf("disconnect\n");
break;
}
else if ( len < 0 )
{
printf("socket recv data fail [%d]\n", errno);
break;
}
} while ( flag );

printf("close socket\n");
//close(sfd);
return 0;
}

想不出来问题出在哪里,这是客户端的程序 我看不知道会是哪里的问题,请教了
wwwunix 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qqxlt 的回复:]

那要是没有打开 如何打开端口呢?
[/Quote]
最简单的方法就是运行相关的服务器程序。
如果没有服务器程序,则需要自己写一个服务器程序。
wwwunix 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qqxlt 的回复:]

des.sin_addr.s_addr 这个IP地址是不是就是LINUX模块的IP地址?
[/Quote]
严格的说,这个地址是服务器的地址,服务器可以是linux的,也可以是windows或者其他操作系统。
qqxlt 2010-08-26
  • 打赏
  • 举报
回复
那要是没有打开 如何打开端口呢?
qqxlt 2010-08-26
  • 打赏
  • 举报
回复
des.sin_addr.s_addr 这个IP地址是不是就是LINUX模块的IP地址?
wwwunix 2010-08-26
  • 打赏
  • 举报
回复
我用localhost测通了我觉得是端口开了
------------------------
这个不一定。有可能server只在localhost的lo上监听。最可靠的是通过ip地址来测试。
qqxlt 2010-08-26
  • 打赏
  • 举报
回复
INADDR_ANY 这个不是说明的是使用默认的地址的么?
inet_addr(DEST_IP);
#define DEST_IP 192.168.3.127

我用localhost测通了我觉得是端口开了,协议错误指的是什么呢?请教了
Linux-Torvalds 2010-08-25
  • 打赏
  • 举报
回复
两个原因,端口没有开放,或者协议使用错误。
jessiefn 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qqxlt 的回复:]
是这样的我的这个程序在一个LINUX模块下跑,上位机的IP是192.168.3.1
上位机我开了之后界面就死机了,没有响应 我用localhost 测试4001端口发送正常
[/Quote]

localhost也不是INADDR_ANY啊,是INADDR_LOOPBACK
wwwunix 2010-08-25
  • 打赏
  • 举报
回复
你可以在另外一台linux机器上用下面的命令来看看服务是否开启了:
telnet ip地址 端口号
例如:
telnet 192.168.3.1 4001
wwwunix 2010-08-25
  • 打赏
  • 举报
回复
des.sin_addr.s_addr = INADDR_ANY;//inet_addr(DEST_IP);
你这条语句用的是哪个地址?这个地址上的服务开启了吗?
qqxlt 2010-08-25
  • 打赏
  • 举报
回复
是这样的我的这个程序在一个LINUX模块下跑,上位机的IP是192.168.3.1
上位机我开了之后界面就死机了,没有响应 我用localhost 测试4001端口发送正常
wwwunix 2010-08-25
  • 打赏
  • 举报
回复
你的192.168.3.127的机器上端口4001上没有开服务监听程序。
通俗的说,就是你的192.168.3.127机器上的服务没有开。
jessiefn 2010-08-25
  • 打赏
  • 举报
回复
猜测一下,if ( connect(sfd, (struct sockaddr*)&des, sizeof(des)) < 0 )
加载更多回复(1)

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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