我可以使用BSD api指定客户端以太网适配器吗?

时间:2016-10-11 00:39:33

标签: macos socket.io

我在Mac OS中使用基本的BSD套接字命令编写简单的客户端套接字命令 - socket(),connect(),write()等。我可以指定主机IP和端口,并在连接到的LAN以太网上成功通信相同的网络。但是,启用WiFi后,这会阻止所有通信。

在系统偏好设置中关闭WiFi或将以太网适配器升级到列表顶部不是一种选择。如何通过指定本地以太网适配器强制客户端connect()?

2 个答案:

答案 0 :(得分:0)

通过以太网与WiFi连接LAN服务器没有任何区别。操作系统和LAN路由器在硬件层处理任何物理差异,您的代码不需要做任何特殊处理。只要您有某种类型的LAN连接,无论是以太网还是WiFi,都可以根据需要将连接从客户端的IP路由到LAN上的服务器IP

话虽这么说,如果您同时启用了以太网和WiFi连接,并且您想控制哪个适配器用于给定套接字,您可以简单地"paths": { "/concat-params/{userid}": { "get": { "parameters": [ { "name": "userid", "in": "path", "required": true, "type": "string" }, { "name": "docid", "in": "query", "required": false, "type": "string" } ], "responses": {...}, "x-amazon-apigateway-integration": { "responses": {...}, "requestParameters": { "integration.request.path.userid":"method.request.path.userid", "integration.request.path.docid":"method.request.querystring.docid" }, "uri": "https:.../{userid}-{docid}", ... } } } 套接字到IP地址调用bind()之前所需的适配器。如果您不知道IP地址,但知道适配器的接口名称,则可以使用connect()枚举可用接口,然后遍历该列表,直到找到您的名称为止。感兴趣,然后你将拥有它的IP地址。

答案 1 :(得分:0)

好的,所以我的代码试图绑定到套接字然后连接到套接字看起来像这样(借口缺乏错误处理)。我还在本地适配器上设置了一个端口以匹配服务器端口,我不知道为什么,我确实尝试了随机端口号。我不确定应该是什么:

    // create socket and bind on local adapter
int sockfd;
struct sockaddr_in serverAddress;
(sockfd = socket(AF_INET, SOCK_STREAM, 0));
bzero(&serverAddress, sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(5123);
// now set client IP on prefered interface
inet_pton(AF_INET, "10.95.161.192", &serverAddress.sin_addr);
bind(sockfd, (struct sockaddr *)&serverAddress, sizeof(serverAddress));


// rewrite socket with server address to connect
(sockfd = socket(AF_INET, SOCK_STREAM, 0));
bzero(&serverAddress,sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(5123);
// now set server IP
inet_pton(AF_INET, "192.168.30.3", &serverAddress.sin_addr);
connect(sockfd, (struct sockaddr *)&serverAddress, sizeof(serverAddress));

// write to socket
NSString *str = @"itemset('Away Colour', 'PRIM_RECGLO_MAT', 'genericaway');";
const char *b = [str UTF8String];
write(sockfd, b, strlen(b));
str = [NSString stringWithFormat:@"itemset('genericaway', 'MAT_COLOR', vector4(%f, %f, %f, 1));",self.red2Val,self.green2Val,self.blue2Val];
b = [str UTF8String];
write(sockfd, b, strlen(b));
close(sockfd);