我需要一个具有以下行为的套接字(或其他IPC方法):
writer需要能够在不阻塞的情况下将数据发送到套接字
如果没有人收听,则丢弃数据
像往常一样,读者需要能够连接并接收这些数据
我做了什么:
通过打电话创造了一个袜子
sock = socket (PF_LOCAL, SOCK_DGRAM, 0); //sock is an integer
Run Code Online (Sandbox Code Playgroud)
把它绑起来
struct sockaddr_un name;
memset(&name,0,sizeof(struct sockaddr_un));
name.sun_family = AF_LOCAL;
strncpy (name.sun_path, filename, sizeof (name.sun_path)); //filename contains "/cosmos"
bind (sock, (struct sockaddr *) &name, sizeof(struct sockaddr_un));
Run Code Online (Sandbox Code Playgroud)
然后对它进行了民意调查
struct pollfd pld;
pld.events = POLLOUT;
pld.fd = sock;
pld.revents=0;
//in loop
poll(&pld,1,50);
if(pld.revents & POLLOUT)
write(fr,mydata,19);
Run Code Online (Sandbox Code Playgroud)
执行(重复)执行写入的跟踪输出显示.听听它我做了:
struct sockaddr_un cos_name;
int cosmos;
char buffer[100];
memset(&cos_name,0,sizeof(struct sockaddr_un));
strncpy (cos_name.sun_path, COSMOS_SOCKET, sizeof (cos_name.sun_path));
memset(buffer,0,100);
cosmos = socket (PF_LOCAL, SOCK_DGRAM, 0);
//check on cosmos being 0
if (connect(cosmos,(struct sockaddr*) &cos_name, sizeof(struct sockaddr_un)) != 0)
{
printf("Connecting failed: %s.\n",strerror(errno));
return;
}
printf("Listening successfully started.\n");
//loop
{
read(cosmos,buffer,100);
printf("Recieved: %s.\n",buffer);
}
Run Code Online (Sandbox Code Playgroud)
但是,"收到的......"从未打印过.
需要改变什么来实现所需的功能?最后一个循环中的子句应该是什么?(我正在使用一个简单的"现在运行1000次").
呃,我想你需要在UDP套接字上读一点.
他们没有连接.您只需将数据包发送到目的地并希望有人正在收听.
在服务器端,您recvfrom()
用来读取数据包.为了发送一个数据包发送回客户端,您使用sendto()
与struct sockaddr *src_addr
您传递给你的recvfrom()
(它填充为发送您刚刚收到的数据包中的客户端的信息).
客户端也需要绑定端口,并用于recvfrom()
从服务器返回数据包.
服务器端:
recvfrom()
sendto()
使用返回的信息将数据包发送回客户端recvfrom()
客户端:
sendto()
recvfrom()