问题描述
我有一个C套接字,它监听localhost上的端口1001。我也有连接到IP 127.0.0.1上端口1001的客户端代码。如果我将客户的代码发送给我的朋友,当我们位于不同的网络上时,他如何访问我的机器?我是否可能仅通过更改服务器代码以使我的公共IP为端口1001上的连接打开而打开?下面是简单的服务器代码:
obs:我正在学习C。
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BUFSIZE 256
short SocketCreate(void)
{
short hSocket;
printf("Create the socket\n");
hSocket = socket(AF_INET,SOCK_STREAM,0);
// close(hSocket);
return hSocket;
}
int BindCreatedSocket(int hSocket)
{
int iRetval = -1,ClientPort = 1001;
struct sockaddr_in remote = {0};
remote.sin_family = AF_INET;
remote.sin_addr.s_addr = htonl(INADDR_ANY);
remote.sin_port = htons(ClientPort);
iRetval = bind(hSocket,(struct sockaddr *)&remote,sizeof(remote));
return iRetval;
}
int main(int argc,char *argv[])
{
int socket_desc,sock,clientLen;
struct sockaddr_in client;
char client_message[200] = {0},message[9999] = {0};
char buf[BUFSIZE];
socket_desc = SocketCreate();
if (socket_desc == -1)
{
printf("Could not create socket");
return 1;
}
printf("Socket created\n");
if (BindCreatedSocket(socket_desc) < 0)
{
perror("bind Failed.");
return 1;
}
printf("Waiting for incoming connections...\n");
listen(socket_desc,3);
while (1)
{
clientLen = sizeof(struct sockaddr_in);
sock = accept(socket_desc,(struct sockaddr *)&client,(socklen_t *)&clientLen);
if (sock < 0)
{
perror("accept Failed");
return 1;
}
// printf("Connection accepted\n");
memset(client_message,'\0',sizeof(client_message));
memset(message,sizeof(message));
if (recv(sock,client_message,200,0) < 0)
{
printf("recv Failed");
break;
}
if (strcmp(client_message,"exitserver") == 0)
{
close(socket_desc);
close(sock);
break;
}
}
return 0;
}
解决方法
我有一个C套接字,它监听localhost上的端口1001。我也有 连接到IP 127.0.0.1上端口1001的客户端代码。如果我 将客户的代码发送给我的朋友,他怎么能访问我的 机器何时会在不同的网络上?
他们不能。地址127.0.0.1是 loopback 地址。发送到该地址的数据包始终定向到发送它们的计算机。
我是否可以仅通过更改服务器代码来使我 为端口1001上的连接打开了公共IP?
您拥有公共IP吗? 127.0.0.1当然不是一个,而且大多数使用消费者级互联网服务的人都没有。如果确实有,那么您可能必须做出特殊安排才能获得它,并且您可能会为此特权付出更多。
但是,假设您确实拥有公共IP或已安排获得一个IP,则不能,您不能确保通过服务器程序打开了端口。您的程序可以在该地址上侦听而不必大惊小怪,但是您还必须考虑防火墙-至少在您的本地计算机上可能有一个,在本地路由器上至少有一个。
此外,在设置公共服务器之前,最好检查一下ISP的政策和用户协议。 ISP禁止在消费者Internet连接上运行面向外部的服务并不少见。他们通常希望您为该特权支付更多费用,这也使ISP可以更轻松地管理其网络。