【发布时间】:2019-05-22 00:30:48
【问题描述】:
我编写了一个程序来通过网络(或可能是互联网)播放滴答声。我是用 C 写的。
当我在同一台机器上运行主机和客户端时,程序运行良好。但是,当它在两台不同的机器上运行时,我无法建立连接。
我在两台计算机上都使用 Ubuntu 18.04 LTS。我不明白为什么这很重要,但是一个通过以太网连接到路由器。另一个以无线方式连接到网络。 ufw verbose 表明防火墙在两台计算机上都处于非活动状态。
我已经尝试过的事情:
- 将服务器名称添加到 /ect/hosts 中的主机,而不是键入 程序参数中的 IP 地址(在本地双向工作 机器,不能通过网络工作)。
- 向路由器防火墙添加防火墙例外。
- 端口转发我在路由器上使用的端口 (5001)。
- nmap 到运行主机的计算机的 ip 显示端口 5001/tcp 已通过服务“commplex-link”打开
- 可以通过网络从远程计算机远程登录到主机。
void network_host(void) {
int sockfd, newsockfd, portno, clilen;
struct sockaddr_in serv_addr, cli_addr;
int n;
struct game *main_game = createboard();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("On opening socket ERROR: \n");
exit(1);
}
memset(&serv_addr, 0, sizeof serv_addr );
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof serv_addr ) < 0 ) {
perror("On socket binding ERROR: \n");
exit(1);
}
printf("Waiting for opponent . . .\n");
listen(sockfd, 1);
clilen = sizeof cli_addr;
memset(&cli_addr, 0, clilen);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
perror("On accepting connection ERROR: \n");
exit(1);
}
printf("Opponent connected!\n");
while (main_game->play) {
printboard(main_game);
entermove(main_game, GAME_HOST, newsockfd);
checkwin(main_game);
}
}
void network_client(char *host_name) {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
struct game *main_game = createboard();
portno = 5001;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);
}
server = gethostbyname(host_name);
if (server == NULL) {
fprintf(stderr, "Error, no such host.\n");
exit(0);
}
memset((char *) &serv_addr, 0, sizeof serv_addr);
serv_addr.sin_family = AF_INET;
memcpy((char *)server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Error connecting.\n");
exit(1);
}
while (main_game->play) {
printboard(main_game);
entermove(main_game, GAME_CLIENT, sockfd);
checkwin(main_game);
}
}
由于这个程序在连接到本地主机时可以工作,nmap 显示端口远程打开,我可以远程登录到程序,我完全不知道下一步该去哪里。
在我看来,它不是编码错误,因为它可以在本地工作,但由于我可以 telnet 进入程序,所以它似乎不应该是网络错误。
我愿意回溯这些步骤(也许其中一些我只做对了一半)。但也愿意接受其他可能的想法。
【问题讨论】:
-
贴出的代码无法编译!您希望我们如何重现该问题?请发布minimal reproducible example,以便我们重现问题并帮助您调试。
-
您在尝试通过网络访问另一台计算机时使用什么主机名?
-
OT:始终检查调用 C 库函数的返回值,例如:
socket()、accept()、listen()等,以确保操作成功