c - C Socket 代码在 LAN 内工作,但不能在 WAN 上工作?拒绝连接?
问题描述
我一直在开发一个连接 4 游戏,该游戏在 TCP 连接的主要功能中包含客户端和服务器代码。我无法通过互联网连接。我尝试在不在 LAN 上的笔记本电脑上运行客户端代码,指定 LAN 的公共 IP 和所需的端口号。但是,当连接失败时,继续拒绝连接作为我的错误消息。
//客户端代码
if(argc == 3){
turn = CLIENT;
int status, client_sockfd;
struct addrinfo hints, *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if((status = getaddrinfo(argv[1], argv[2], &hints, &res)) != 0){
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
if((client_sockfd = socket(res -> ai_family, res -> ai_socktype, res -> ai_protocol)) == -1){
fprintf(stderr, "socket creation error: %s\n", gai_strerror(client_sockfd));
exit(1);
}
if((connect(client_sockfd, res -> ai_addr, res -> ai_addrlen)) == -1){
perror("cannot connect");
exit(1);
}
freeaddrinfo(res); //free res structure
//Start of Game: Client
recv(client_sockfd, player1, 25, 0);
printf("Player 2, enter your name:\n");
fgets(player2, sizeof(player2), stdin);
send(client_sockfd, player2, 25, 0);
sock = client_sockfd;
}
//服务器网络代码
else{
turn = SERVER;
int server_sockfd;
printf("Setting up the game\n");
//server port
if(argc == 2)
myport = argv[1];
else
myport = "12345";
int status, sock_fd;
int opt = 1;
struct addrinfo hints, *res;
struct sockaddr_storage their_addr;
socklen_t addr_size;
memset(&hints, 0, sizeof(hints)); //make sure hints is empty
hints.ai_family = AF_UNSPEC; //ipv6 or ipv4 doesn't matter
hints.ai_socktype = SOCK_STREAM; //require TCP stream sockets
hints.ai_flags = AI_PASSIVE;
//load res adderinfo struct
if((status = getaddrinfo(NULL, myport, &hints, &res)) != 0){
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
//create socket with res
if((sock_fd = socket(res -> ai_family, res -> ai_socktype, res -> ai_protocol)) == -1){
fprintf(stderr, "socket creation error: %s\n", gai_strerror(sock_fd));
exit(1);
}
//reuseable socket
if(setsockopt(sock_fd,SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1){
perror("setsockopt");
exit(1);
}
//bind socket for use
if((bind(sock_fd, res -> ai_addr, res-> ai_addrlen)) == -1){
perror("binding fail");
exit(1);
}
//listen with a backlog of 5
listen(sock_fd, 5);
addr_size = sizeof(their_addr);
if((server_sockfd = accept(sock_fd, (struct sockaddr *)&their_addr, &addr_size)) == -1){
perror("accepting failure");
exit(1);
}
freeaddrinfo(res); //free res structure
//Start of Game: Server
printf("Player 1, please enter your name:\n");
fgets(player1, sizeof(player1), stdin);
send(server_sockfd, player1, 25, 0);
recv(server_sockfd, player2, 25, 0);
sock = server_sockfd;
}
有什么想法吗?据我了解,作为客户端,我的数据包应该到达服务器的网关,而 NAT 应该使用我的目标端口将我的消息重定向到服务器?
解决方案
推荐阅读
- flutter - 错误:没有名为“列表”的命名参数
- css - Flexdashboard 导航栏颜色
- reactjs - 重定向使用
来自反应路由器 - python - 如何解析 JSON 并确定值是集合还是嵌套集合?
- python - Django 自定义表单动态原始 ID
- reactjs - 在本机反应中使用抽屉导航登录和注销
- php - Linux 将 PHP 7.4 添加到 Webmin/Virtualmin
- c++ - 编译 DLL(CURL 库)的问题(Visual Studio)
- javascript - 在 Jquery 中使用多个内置函数
- r - 通过取这些重复的平均值来过滤具有超过 n 次重复的数据