我工作在基于网络安全的iOS应用程序。我正在尝试为线程之间的通信创建一个本地套接字。我在iOS应用程序中使用C语言进行此操作。套接字创建失败,但套接字()和绑定()方法不返回-1
问题是,当我创建和绑定套接字它不会给出任何错误。但是当我尝试通过这个套接字发送一些数据时,它会失败。代码创建和插座的绑定如下:
int open_and_bind_socket(int *sockfd, const char *sname)
{
//sname is socket name with full path
size_t len = strlen (sname);
size_t bytes = sizeof (struct sockaddr_un) + len + 1 - sizeof (((struct sockaddr_un *)0)->sun_path);
struct sockaddr_un *unaddr = (struct sockaddr_un *)malloc (bytes);
size_t size;
if((*sockfd = socket (AF_LOCAL, SOCK_DGRAM, 0)) < 0)
{
AGENT_DEBUG(LOG_ERR, "%s", "Failed to open socket");
return ~0;
}
unaddr->sun_family = AF_UNIX;
unaddr->sun_len = bytes;
memcpy(unaddr->sun_path, sname,len+1);
size = (offsetof (struct sockaddr_un, sun_path)
+ strlen (unaddr->sun_path));
if(bind(*sockfd,(struct sockaddr*)unaddr,size) < 0)
{
AGENT_DEBUG(LOG_ERR, "%s", "Failed to bind the socket");
AGENT_DEBUG(LOG_ERR, "Recvfrom MSG_PEEK Failure: %s, Socket Fd = %d\n",
strerror(errno), sockfd);
return ~0;
}
if(0 != chmod(sname, 0666))
{
AGENT_DEBUG(LOG_ERR, "%s", "Unable to chmod Socket");
return ~0;
}
//unlink(sname);
return 0;
}
插槽上发送数据的代码如下:
int data_send(int sockfd, tsIpcMsg *pMsgData)
{
memset(x,'\0', sizeof(x));
strcpy(x, buffer);
strcat(x,"/AGENTSOCKET");
size_t len = strlen (x);
size_t bytes = sizeof (struct sockaddr_un) + len + 1 - sizeof (((struct sockaddr_un *)0)->sun_path);
struct sockaddr_un *saun = (struct sockaddr_un *)malloc (bytes);
memset(saun, 0, sizeof(*saun));
saun->sun_family = AF_UNIX;
saun->sun_len=bytes;
memcpy(saun->sun_path, x,len+1);
memset(x,'\0', sizeof(x));
if(-1 == (sendto(sockfd,(void*)pMsgData, sizeof(tsIpcMsg)+pMsgData->dataLen , 0, (struct sockaddr *)saun, sizeof(*saun))))
{
AGENT_DEBUG(LOG_ERR, "%s", "Failed to send message from thread to main");
return ~0;
}
return 0;
}
当我登录通过的sendto()返回的错误号功能它赋予价值'2'表示“不存在这样的文件或目录:路径名中的组件不存在或者是悬挂的符号链接,或者路径名为空。”
所以,我认为套接字没有得到正确创建,这就是为什么sendto()方法失败,而套接字和绑定方法不会给出任何错误。
我在ios模拟器(iPhone 7 plus)上运行这个应用程序。插槽的路径如下: “/ Users/Admin/Library/Developer/CoreSimulator/Devices/FC85979F-A627-4361-B4BD-DD794AB009C9/data/Containers/Data/Application/C45B9A05-F482-4011-8EA0- 947A8C489367/Documents/app/AGENTSOCKET“,其中AGENTSOCKET是套接字的名称。
我创建的目录结构,直到应用程序文件夹,然后附加插槽名称,而它通过以下方式创建套接字:
mkdir(path,0777);//path is till app directory
strcat(path, "/AGENTSOCKET");
谁能帮我解决了这一点。
谢谢。
这是一种奇怪的方式来计算地址所需要的尺寸结构体。 'offsetof(struct sockaddr_un,sun_path)+ len + 1'不会更简单和更清晰吗? –
此外,POSIX没有为'struct sockaddr_un'记录一个'sun_len'成员,并且我甚至无法找到它的文档,甚至不能作为iOS特有的功能。如果它实际上存在,那么它不太可能用于应用程序。 –
什么是'x' ...?你的'data_send'以'memset(x,'\ 0',sizeof(x))''开始......但它是什么? – Myst