【发布时间】:2020-04-19 06:02:09
【问题描述】:
我正在使用 Xcode 11.3.1 在 MacOS 环境中制作套接字程序。我目前正在使用 C++ 语言模板 Project - MacOs - Command Line Tool 制作我的项目。但是,当我接受我的 Socket 时,我遇到了一些问题。
#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#define PORT 37716
class Communications{
public:
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
Communications(){
server_fd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
bind(server_fd, (struct sockaddr *)&address, sizeof(address));
listen(server_fd, 3);
cout << "[Server] Listening in port " << PORT << endl;
new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
cout << "[Server] Client has successfully connected." << endl;
}
};
int main(void){
Communications CommunicationsObj = Communications();
return 0;
}
这是我的代码的主要类。它只是一个基本的端口绑定、监听和接受序列。我已经确认此代码在终端上由 G++ 编译时有效。我已经用我的简单 Python 代码进行了测试。但是,当我使用 Xcode(左上角的播放按钮)进行调试时,我无法使用套接字连接到该程序。运行此代码时,Xcode 似乎正在阻止网络连接。
供您参考,我用来连接到我的 C++ 程序的 Python 脚本是这样的。
from socket import *
port = 37716
ClientSock = socket(AF_INET, SOCK_STREAM)
ClientSock.connect(('', port))
我目前正在使用内部网络的同一台机器上进行测试,这意味着所有连接都将转到 127.0.0.1
当我用 G++ 编译并在终端环境中运行时,一切顺利。但是在 Xcode 上调试时,会出现这些错误。
Traceback (most recent call last):
File "a.py", line 7, in <module>
client_sock.connect(('',port))
ConnectionRefusedError: [Errno 61] Connection refused
在程序的C++端,屏幕是这样的
[Server] Listening in port 37716
永远这样。这意味着 Xcode 在该端口上没有收到任何传输。
我目前在整个互联网上寻找了很多方法,包括 Stack Overflow。我尝试在 Xcode 设置中添加“功能”并启用网络服务器和客户端。这没有帮助,并导致 Xcode 出现另一个问题。我尝试过其他方法,例如使用 root 权限调试 Xcode,但没有奏效。另外,供您参考,我的端口 37716 是一个空端口,目前没有进程正在使用它。
【问题讨论】:
-
检查来自
bind和listen的返回码是否成功。任何一个(或两者)都可能失败,你永远不会知道。 -
@user4581301 bind 和 listen 函数都返回 0 作为它们的返回值。几秒钟前刚检查过。
-
时髦。那是唾手可得的果实。我的 Mac-fu 几乎不存在。您有可以调用的a
netstat或类似netstat 的程序吗?在普通的 Unix 机器上,我会运行netstat -lpt并确保操作系统同意正在监听该端口。 -
在这两种情况下
netstat -lpt都返回unknown or uninstrumented protocol。但是,当我在做lsof -nP -iTCP:37716 | grep LISTEN时,通过终端运行二进制文件确实显示了它的进程。但是,当在 Xcode 中使用相同的命令时,它不会显示该过程。我猜这是由于 Xcode IDE 本身,而不是代码或套接字。 -
那超出了我的技能范围。希望了解 XCode 来龙去脉的人可以帮助您。如果您先弄清楚,请自行回答。这个会很有趣,我想。