Socket编程connection refused问题

景语 2012-02-19 02:45:27
学习socket,自己试着编了一个C/S程序
代码如下:

/*
*
* client
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SERVPORT 1234
#define MAXDATASIZE 100
int main(int argc, char *argv[]) {
int sockfd, sendBytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in servAddr;
if(argc != 2) {
fprintf(stderr,"usage:./client [hostname]");
exit(1);
}
/*translate the address*/
if((host = gethostbyname(argv[1])) == NULL) {
perror("fail to get host by name");
exit(1);
}
printf("Success to get host by name...\n");
/*establish a socket*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("fail to establish a socket");
exit(1);
}
printf("Success to establish a socket...\n");

/*init sockaddr_in*/
servAddr.sin_family = AF_INET;
servAddr.sin_port = SERVPORT;
servAddr.sin_addr = *((struct in_addr *)host -> h_addr);
bzero(&(servAddr.sin_zero), 8);
/*connect the socket*/
if(connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) {
perror("fail to connect the socket");
exit(1);
}
printf("Success to connect the socket...\b");
/*send datas to server*/
if(sendBytes = send(sockfd, "hello", 5, 0) == -1) {
perror("fail to send datas");
exit(1);
}
printf("Success to send data!");
close(sockfd);
}



/*
*
* server
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SERVPORT 1234
#define BACKLOG 20
#define MAX_CON_NO 10
#define MAX_DATA_SIZE 5
int main() {
struct sockaddr_in serverSockaddr, clientSockaddr;
int sinSize, recvBytes;
int sockfd, clientfd;
char buf[MAX_DATA_SIZE];
/*establish a socket*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("fail to establish a socket");
exit(1);
}
printf("Success to establish a socket...(sockfd = %d)\n", sockfd);
/*init sockaddr_in*/
serverSockaddr.sin_family = AF_INET;
serverSockaddr.sin_port = htons(SERVPORT);
serverSockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(serverSockaddr.sin_zero), 8);
/*bind socket*/
if(bind(sockfd, (struct sockaddr *)&serverSockaddr, sizeof(struct sockaddr))== -1) {
perror("fail to bind");
exit(1);
}
printf("Success to bind the socket...\n");
/*listen on the socket*/
if(listen(sockfd, BACKLOG) == -1) {
perror("fail to listen");
exit(1);
}
printf("Success to listen on the socket...\n");
/*accept a client's request*/
if((clientfd = accept(sockfd, (struct sockaddr *)&clientSockaddr, &sinSize)) == -1) {
perror("fail to acceot");
exit(1);
}
printf("Success to accpet...\n");
/*call recv to receive datas*/
if((recvBytes = recv(sockfd, buf, MAX_DATA_SIZE, 0)) == -1) {
perror("fail to receive datas");
exit(1);
}
printf("Receive a connection:%s \n", buf);
close(sockfd);
}


在UBUNTU防火墙关闭情况下终端1执行

jimmy@MyPet:~$ gcc -o server server.c
jimmy@MyPet:~$ gcc -o client client.c
jimmy@MyPet:~$ ./server
Success to establish a socket...(sockfd = 3)
Success to bind the socket...
Success to listen on the socket...


终端2执行
    jimmy@MyPet:~$ ./client MyPet
Success to get host by name...
Success to establish a socket...
fail to connect the socket: Connection refused
jimmy@MyPet:~$ ./client 127.0.0.1
Success to get host by name...
Success to establish a socket...
fail to connect the socket: Connection refused
jimmy@MyPet:~$ ./client 127.0.1.1
Success to get host by name...
Success to establish a socket...
fail to connect the socket: Connection refused
jimmy@MyPet:~$


查看端口

jimmy@MyPet:~$ nmap MyPet
Starting Nmap 5.21 ( http://nmap.org ) at 2012-02-19 14:35 CST
Nmap scan report for MyPet (127.0.1.1)
Host is up (0.00043s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
21/tcp open ftp
1234/tcp open hotline
Nmap done: 1 IP address (1 host up) scanned in 0.19 seconds


请问众位大神这client端运行时的connection refused是怎么回事呢?服务器的问题吗?
但是根据端口情况应该是在进行监听的。

谢谢!
...全文
2715 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
景语 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]

客户端的PORT没做htons
[/Quote]

解决了,非常感谢!
qq120848369 2012-02-19
  • 打赏
  • 举报
回复
if(connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr)) == -1) {

第三个参数用sizoef(struct sockaddr_in)
qq120848369 2012-02-19
  • 打赏
  • 举报
回复
客户端的PORT没做htons
景语 2012-02-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

C/C++ code
netstat -tanlp 看看你的服务端处于什么状态, 是listen还是time_wait.

错误原因是因为服务端bind失败, socket创建之后, int on = 1; setsockopt(SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); bind();listen();
[/Quote]

这是服务端状态结果
jimmy@MyPet:~$ netstat -tanlp 127.0.1.1
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 2485/server


另外我在socket()与bind()之间加入了你说的代码

int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


重新编译运行后依然提示为connection refused
qq120848369 2012-02-19
  • 打赏
  • 举报
回复
netstat -tanlp 看看你的服务端处于什么状态, 是listen还是time_wait.

错误原因是因为服务端bind失败, socket创建之后, int on = 1; setsockopt(SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); bind();listen();

23,120

社区成员

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

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