c-套接字错误:连接被拒绝

c-套接字错误:连接被拒绝,c,linux,sockets,ubuntu,unix,C,Linux,Sockets,Ubuntu,Unix,我试图用C语言编写一个程序,当我试图通过端口9000或任何其他端口连接时,会出现这个错误。 当我写这篇文章时,它给了我连接被拒绝: /客户端主机名ubuntu 9000 /客户127.0.0.1 9000 /客户端本地主机9000 -->Server.c代码: 我做错了什么?错在哪里?请帮帮我 #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<netd

我试图用C语言编写一个程序,当我试图通过端口9000或任何其他端口连接时,会出现这个错误。 当我写这篇文章时,它给了我连接被拒绝:

/客户端主机名ubuntu 9000

/客户127.0.0.1 9000

/客户端本地主机9000

-->Server.c代码:

我做错了什么?错在哪里?请帮帮我

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main(int arg,char*argv[]){
int sd,sd_c,port,r;
struct sockaddr_in my_addr, cli_addr;
socklen_t cli_addr_size;
char buf[100];
if (arg!=2){
        fprintf(stderr, "Use:server-port\n");
        return 1;
    }
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_UNIX;
if(1!=sscanf(argv[1],"%d",&port)){
    fprintf(stderr,"Port number must be a number\n");
    return 1;
    }
my_addr.sin_port=htons(port);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);

sd=socket(PF_UNIX,SOCK_STREAM,0);
if(-1==bind(sd,(struct sockaddr*)&my_addr,sizeof(my_addr))){
    perror("bind()");
        return 1;
    }
listen(sd,1);
cli_addr_size=sizeof(cli_addr);
sd_c=accept(sd,(struct sockaddr*)&cli_addr,&cli_addr_size);
printf("Client connected from %s:%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port));
close(sd);
while((r=recv(sd_c,buf,100,0))>0){
    write(1,buf,r);
    }
    if(r==-1){
     perror("recv()");
    return 1;
    }
send(sd_c,"xyz",3,0);
close(sd_c);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int arg,char*argv[]{
内部sd,sd_c,端口,r;
my_addr、cli_addr中的结构sockaddr_;
socklen\u t cli\u addr\u size;
char-buf[100];
如果(arg!=2){
fprintf(stderr,“使用:服务器端口\n”);
返回1;
}
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_UNIX;
如果(1!=sscanf(argv[1]、%d”、&port)){
fprintf(stderr,“端口号必须是一个数字\n”);
返回1;
}
my_addr.sin_port=htons(端口);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
sd=套接字(PF_UNIX,SOCK_流,0);
if(-1==bind(sd,(struct sockaddr*)和my_addr,sizeof(my_addr))){
perror(“bind()”);
返回1;
}
听(sd,1);
cli_addr_size=sizeof(cli_addr);
sd_c=accept(sd,(struct sockaddr*)&cli_addr和cli_addr\u size);
printf(“从%s连接的客户端:%d\n”、inet\u ntoa(客户端地址sin\u addr)、ntohs(客户端地址sin\u端口));
关闭(sd);
而((r=recv(sd_c,buf,100,0))>0){
写入(1,buf,r);
}
如果(r==-1){
perror(“recv()”);
返回1;
}
发送(sd_c,“xyz”,3,0);
关闭(sd_c);
返回0;
}
-->Client.c代码

#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main(int arg,char*argv[]){
int sd,r,port;
struct hostent *hh;
struct sockaddr_in adr;
char buf[100];
if (arg!=3){
        fprintf(stderr, "Use : client-address-port\n");
        return 1;
    }
memset(&adr,0,sizeof(adr));
adr.sin_family=AF_INET;
if(1!=sscanf(argv[2],"%d",&port)){
    fprintf(stderr,"Port number is not a number\n");
    return 1;
    }
adr.sin_port=htons(port);
hh=gethostbyname(argv[1]);
if(hh==0||hh->h_addrtype!=AF_INET||hh->h_length<=0){
    fprintf(stderr,"Can't find out server address\n");
    return 1;
    }
memcpy(&adr.sin_addr,hh->h_addr_list[0],4);
sd=socket(PF_INET,SOCK_STREAM,0);

if(-1==connect(sd,(struct sockaddr*)&adr,sizeof(adr))){
    perror("connect()");
        return 1;
    }
send(sd,"abcd",4,0);
shutdown(sd,SHUT_WR);
while((r=recv(sd,buf,100,0))>0){
    write(1,buf,r);
    }
    if(r==-1){
     perror("recv()");
    return 1;
    }
close(sd);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int arg,char*argv[]{
内部sd,r,端口;
结构宿主*hh;
adr中的结构sockaddr_;
char-buf[100];
如果(arg!=3){
fprintf(stderr,“使用:客户端地址端口”);
返回1;
}
memset(&adr,0,sizeof(adr));
adr.sin_family=AF_INET;
如果(1!=sscanf(argv[2],%d',&port)){
fprintf(stderr,“端口号不是数字\n”);
返回1;
}
adr.sin_港=htons(港);
hh=gethostbyname(argv[1]);
如果(hh==0 | | hh->h|addrtype!=AF|INET | hh->h|lengthh|u addr_list[0],4);
sd=套接字(PF_INET,SOCK_STREAM,0);
如果(-1==connect(sd,(struct sockaddr*)&adr,sizeof(adr))){
perror(“connect()”);
返回1;
}
发送(sd,“abcd”,4,0);
停堆(sd、SHUT\U WR);
而((r=recv(sd,buf,100,0))>0){
写入(1,buf,r);
}
如果(r==-1){
perror(“recv()”);
返回1;
}
关闭(sd);
返回0;
}

您在程序中使用了两种不同的协议。客户端程序中的AF_INET和服务器端的AF_UNIX。那是行不通的。修改这些代码行

my_addr.sin_family=AF_UNIX;

当您在客户端使用
AF_INET


希望这会有所帮助……

我的第一个猜测是使用sudo。/client 127.0.0.1 9000Sudo用于1024以上的端口是不需要的。。。服务器说什么,它接受连接吗?此外,服务器似乎在第一个客户端断开连接后退出…sudo命令正在询问我密码,但键盘除了“回车”按钮外不工作。我也不知道出了什么问题。@Sandu,你不需要
sudo
,但是当你做
sudo
时,你输入的密码不会回显到屏幕上是故意的,这很正常。你不希望你的服务器是
PF\u UNIX
你想要的
AF\u INET
my_addr.sin_family=AF_INET;
sd=socket(PF_UNIX,SOCK_STREAM,0);
sd=socket(PF_INET,SOCK_STREAM,0);