在 Xcode Cpp 中使用套接字
Using Sockets in Xcode Cpp
我正在使用 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;
}
这是我的代码的主要 class。它只是一个基本的端口绑定、监听和接受序列。我已经确认这段代码在终端上由 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 在该端口上没有收到任何 t运行 任务。
我目前在整个互联网上寻找了很多方法,包括 Stack Overflow。我尝试在 Xcode 设置中添加 "Capabilities" 并启用网络服务器和客户端。这没有帮助并导致 Xcode 出现另一个问题。我尝试了其他方法,例如使用 root 权限调试 Xcode,但没有用。另外,供您参考,我的端口 37716 是一个空端口,目前没有进程正在使用它。
在过去的 5 个小时里,仅此一项我就尝试了 100 多种方法。并发现它是这样工作的。此代码存在一些问题。
第一个问题是我没有包含 #include <CoreFoundation/CoreFoundation.h>
这个头文件。
第二个问题是由于包含头文件或库的顺序错误。
我正在使用另一个名为 CUESDK.framework 的 .framework 库。如果我在加载此代码之前加载该库,它就会崩溃。它发生的原因有点奇怪。
我不是100%确定它是否解决了。但如果它可以帮助任何人,我会 post 下面我的代码!
#include <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#define PORT 37716
#include <stdio.h>
class ConnectrionBridge{
public:
int servsock;
int enable;
int port;
ConnectrionBridge(void){
servsock = socket(AF_INET, SOCK_STREAM, 0);
if(servsock < 0) perror("Failed to create a socket");
enable = 1;
setsockopt(servsock, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int));
//Bind to "any" address with a specific port to listen on that port
sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
bind(servsock, (sockaddr*)&serv_addr, sizeof(serv_addr));
listen(servsock, 5);
std::cout<< "Listening Server on port " << PORT << std::endl;
//Accept a client
struct sockaddr_storage client_addr_info;
socklen_t len = sizeof client_addr_info;
int clientsock = accept(servsock, (struct sockaddr*)&client_addr_info, &len);
std::cout << "connected" << std::endl;
}
};
我遇到了同样的问题,我刚刚解决了!
出于某些疯狂的原因,当您输入:
using namespace std;
套接字连接在 MacOS 上不起作用。您需要在每个需要它的 method/class 之前手动放置 std::
。
[例如:std::cout
、std::endl
和 std::string
]
我正在使用 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;
}
这是我的代码的主要 class。它只是一个基本的端口绑定、监听和接受序列。我已经确认这段代码在终端上由 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 在该端口上没有收到任何 t运行 任务。
我目前在整个互联网上寻找了很多方法,包括 Stack Overflow。我尝试在 Xcode 设置中添加 "Capabilities" 并启用网络服务器和客户端。这没有帮助并导致 Xcode 出现另一个问题。我尝试了其他方法,例如使用 root 权限调试 Xcode,但没有用。另外,供您参考,我的端口 37716 是一个空端口,目前没有进程正在使用它。
在过去的 5 个小时里,仅此一项我就尝试了 100 多种方法。并发现它是这样工作的。此代码存在一些问题。
第一个问题是我没有包含 #include <CoreFoundation/CoreFoundation.h>
这个头文件。
第二个问题是由于包含头文件或库的顺序错误。
我正在使用另一个名为 CUESDK.framework 的 .framework 库。如果我在加载此代码之前加载该库,它就会崩溃。它发生的原因有点奇怪。
我不是100%确定它是否解决了。但如果它可以帮助任何人,我会 post 下面我的代码!
#include <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#define PORT 37716
#include <stdio.h>
class ConnectrionBridge{
public:
int servsock;
int enable;
int port;
ConnectrionBridge(void){
servsock = socket(AF_INET, SOCK_STREAM, 0);
if(servsock < 0) perror("Failed to create a socket");
enable = 1;
setsockopt(servsock, SOL_SOCKET, SO_REUSEADDR, (char*)&enable, sizeof(int));
//Bind to "any" address with a specific port to listen on that port
sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
bind(servsock, (sockaddr*)&serv_addr, sizeof(serv_addr));
listen(servsock, 5);
std::cout<< "Listening Server on port " << PORT << std::endl;
//Accept a client
struct sockaddr_storage client_addr_info;
socklen_t len = sizeof client_addr_info;
int clientsock = accept(servsock, (struct sockaddr*)&client_addr_info, &len);
std::cout << "connected" << std::endl;
}
};
我遇到了同样的问题,我刚刚解决了!
出于某些疯狂的原因,当您输入:
using namespace std;
套接字连接在 MacOS 上不起作用。您需要在每个需要它的 method/class 之前手动放置 std::
。
[例如:std::cout
、std::endl
和 std::string
]