【发布时间】:2020-11-02 12:27:35
【问题描述】:
我有一个 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, '\0', 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;
}
【问题讨论】:
-
您的服务器是否位于通过 NAT 路由器连接到 Internet 的 LAN 中?您是否在 NAT 路由器中为端口 1001 启用了到服务器的端口转发?
-
obs代表什么? -
@Gerhardh 那么我需要打开路由器上的端口吗?例如,ngrok 是如何工作的?
-
@ArkadiuszDrabczyk 抱歉。是“观察”的缩写
-
在我的路由器上,我需要在路由器的 WebUI 中执行此操作。您需要查看手册如何配置端口转发。我不知道 ngrok
标签: c sockets serversocket