2017-11-06 17 views
0

Cでプログラムを作成しようとしていますが、ポート9000などの他のポート経由で接続しようとするとこのエラーが発生します。私が間違っているのをいただきましc - ソケットエラー:接続が拒否されました

: - >Server.cコード

./client hostname-ubuntu 9000

./client 127.0.0.1 9000

./client localhost 9000

を: それは私がこれを書いたときに、接続が拒否した私に与えますか?間違いはどこですか?お願い助けて。

#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; 
} 

- > client.cをコードあなたはあなたのプログラムに2つの異なるプロトコルを使用している

#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; 
} 
+0

私の最初の推測では、1024以上のポートのためにsudo ./client 127.0.0.1 9000 –

+1

須藤を用いることであろうことができます必要はありません...サーバーは何を言っていますか、それは接続を受け入れますか?また、サーバーは、最初のクライアントが切断した後に終了するようだ... –

+0

コマンドsudoは私にパスワードを要求していますが、キーボードは "Enter"ボタン以外では機能していません。もう一度私は何が間違っているのか分からない。 –

答えて

0

。あなたのクライアントプログラムのAF_INETとサーバー側のAF_UNIX。それは決してうまくいかないでしょう。これらのコード行を変更します。

my_addr.sin_family=AF_INET; 

my_addr.sin_family=AF_UNIX; 

あなたは、クライアント側でAF_INETを使用して、

sd=socket(PF_INET,SOCK_STREAM,0); 

sd=socket(PF_UNIX,SOCK_STREAM,0); 

希望...

関連する問題