0
私はクライアントIPを取得しようとすると、CentOSで動作しているときに常に0.0.0.0を取得しますが、Ubuntuで実行中のコードでは、 :127.0.0.1 その理由はわかりません。クライアントIPを取得するためのLinuxプログラミングは常に0.03.0を取得
私の英語を赦免してください。ここで
コードです:
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include <netinet/ip.h> /* superset of previous */
#define BUF_LEN 1024
int main(int argc, char const *argv[])
{
int sockfd=0;
int bind_ret=0;
int listen_ret=0;
int accept_ret=0;
int read_ret=0;
int write_ret=0;
socklen_t addr_len=0;
char buf[BUF_LEN+1]={0};
struct sockaddr_in client_addr;
struct sockaddr_in ser_addr ={
.sin_family= AF_INET,/* address family: AF_INET */
.sin_port=htons(8888), /* port in network byte order */
.sin_addr.s_addr=inet_addr("127.0.0.1"), /* internet address */
};
//////////////////socket//////////////////////////////////
sockfd=socket(AF_INET ,SOCK_STREAM,0);
if (0>sockfd){
perror("socket");
return -1;
}
////////////////////bind/////////////////////////////////
bind_ret=bind(sockfd, (const struct sockaddr *)&ser_addr,sizeof(ser_addr));
if(0>bind_ret){
perror("bind");
return -1;
}
//////////////////listen//////////////////////////////////
listen_ret=listen(sockfd,10);
if(0>listen_ret){
perror("listen");
return -1;
}
//////////////////accept//////////////////////////////////
accept_ret=accept(sockfd,(struct sockaddr *)&client_addr,&addr_len);
if(0>accept_ret){
perror("accept");
return -1;
}
//////////////////operation_data///////////////////////////////
while(read_ret=read(accept_ret,buf,1024)){ //read data,until no data or error
if(read_ret<0) {
perror("Socket read failed");
return -5;
}
printf("receive:%s\n", buf);
write_ret=write(accept_ret,buf,read_ret);
if(write_ret!=read_ret){
perror("write");
return -1;
}
}
//char *inet_ntoa(client_addr.sin_addr);
char * ip_add =inet_ntoa(client_addr.sin_addr);
int port=client_addr.sin_port;
printf("IP:%s PORT:%d\n", ip_add,port);
close(client_addr);
close(sockfd);
return 0;
}
とコード2:
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUF_LEN 1024
int main(int argc,char const **argv){
int sockfd=0;
int all_ret=0;
socklen_t addr_len=0;
char buf[BUF_LEN+1]={0};
struct sockaddr_in addr={
.sin_family=AF_INET,/* address family: AF_INET */
.sin_port=htons(8888), /* port in network byte order */
.sin_addr.s_addr=inet_addr("127.0.0.1"), /* internet address */
};
char * ip_add =inet_ntoa(addr.sin_addr);
printf("IP:%s \n", ip_add);
//////////////////socket//////////////////////////////////
sockfd=socket(AF_INET ,SOCK_STREAM,0);
if (0>sockfd){
perror("socket");
return -1;
}
//////////////////connection//////////////////////////////////
// int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
addr_len=sizeof(addr);
all_ret=connect(sockfd, (const struct sockaddr *)&addr,addr_len);
if (0>all_ret){
perror("connect");
return -1;
}
//////////////////data send//////////////////////////////////
all_ret=write(sockfd,"test_by_kevin",14);
if (0>all_ret){
perror("write");
return -1;
}
printf("write:%d\n",all_ret);
//////////////////data receive//////////////////////////////////
all_ret=read(sockfd,buf,1024);
if(all_ret<0){
perror("Socket read failed");
return -1;
}
printf("%s\n",buf);
close(sockfd);
}
127.0.0.1があなたのLAN IPアドレスまたはWAN IPアドレスではないことに気が付きましたか?それはあなたのコンピュータ上のループバックアドレスであり、すべての単一のコンピュータはそれらに埋め込まれたそのIPアドレスを持っていて、その使用のために予約されているので、そのIPアドレスとして近隣に広告することはできません。 – ojs
この2つのプログラムは同じPCで動作しているので、ループバックアドレスを使用してください!彼らはCentOSで動作しているとき0.0.0.0を取得します;彼らはUbnutuで動作するとき、彼らはプログラムが2つのIPを取得することができます:127.0.0.1それは私の質問です:それを修正する理由と方法? –