我在Mac OS中使用基本的BSD套接字命令编写简单的客户端套接字命令 - socket(),connect(),write()等。我可以指定主机IP和端口,并在连接到的LAN以太网上成功通信相同的网络。但是,启用WiFi后,这会阻止所有通信。
在系统偏好设置中关闭WiFi或将以太网适配器升级到列表顶部不是一种选择。如何通过指定本地以太网适配器强制客户端connect()?
答案 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);