【发布时间】:2019-07-05 13:29:19
【问题描述】:
我有一个套接字服务器代码和一个客户端代码,它们都在同一台机器上运行。在服务器端,
sockaddr.sin_address.s_address = htonl(INADDRESS_ANY) ;
在客户端
if sockaddr.sin_address.s_address = inet_addr("127.0.0.1") ;
然后套接字连接良好,但如果,
sockaddr.sin_address.s_address = inet_addr("192.168.0.118") ;
连接不上
ifconfig 打印:
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:22:60:70:a0 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 987 bytes 88629 (88.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 987 bytes 88629 (88.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.118 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::6e8a:bbc8:eca7:7c12 prefixlen 64 scopeid 0x20<link>
ether e4:02:9b:84:a4:72 txqueuelen 1000 (Ethernet)
RX packets 20641 bytes 15138450 (15.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12544 bytes 2528692 (2.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
完整代码 服务器,它与 INADRESS_ANY 绑定。客户端连接到它
struct sockaddr_in servaddr, cli;
int sockfd, newSockfd, len;
int err;
char buf[128];
len = sizeof(cli);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd ==-1)perror("error in socket opening");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_port= htons(7800);
err = bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if( err != 0)perror("error in socket binding");
err = listen(sockfd, 5);
if( err != 0)perror("error in listen");
newSockfd = accept(sockfd, (struct sockaddr *) &cli, (socklen_t *) &len);
if(newSockfd ==-1)perror("error in socket accept");
bzero(buf,sizeof(buf));
strcpy(buf, "SANDEEP");
write(newSockfd, buf, sizeof(buf) );
close(newSockfd);
客户端,它连接到上面的服务器
int clientSockfd, newSockfd, err;
struct sockaddr_in servaddr;//, cli;
char buf[128];
clientSockfd = socket(AF_INET, SOCK_STREAM, 0);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr/*("127.0.0.1")*/("192.168.0.118");
servaddr.sin_port = htons(7800);
err = connect(clientSockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(err != 0) perror("error in connect");
bzero(buf,sizeof(buf));
read(clientSockfd, buf, sizeof(buf));
cout<<buf<<endl;
close(clientSockfd);
我在使用端口 7800 时是否做错了什么 连接错误:连接被拒绝
解决了
sockaddr.sin_address.s_address = htonl(INADDRESS_ANY) ;
奇怪,我之前遇到过错误,使用相同
【问题讨论】:
-
"socket 连接良好.." 请添加更多详细信息(如协议),如果可能,请添加服务器和客户端的完整代码。
-
这段代码没有错误检查。您需要检查所有套接字 API 函数的返回值,如果它们失败,请使用
perror打印错误消息。 -
您是否设置了防火墙,例如ufw 如果这是 ubuntu?
-
在您的防火墙上打开端口
192.168.0.118:7800。或者,继续使用localhost。