如何制作"粗心"插座?

Srv*_*v19 0 c sockets linux

我需要一个具有以下行为的套接字(或其他IPC方法):

  1. writer需要能够在不阻塞的情况下将数据发送到套接字

  2. 如果没有人收听,则丢弃数据

  3. 像往常一样,读者需要能够连接并接收这些数据

我做了什么:

通过打电话创造了一个袜子

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次").

Bri*_*ach 8

呃,我想你需要在UDP套接字上读一点.

他们没有连接.您只需将数据包发送到目的地并希望有人正在收听.

在服务器端,您recvfrom()用来读取数据包.为了发送一个数据包发送回客户端,您使用sendto()struct sockaddr *src_addr您传递给你的recvfrom()(它填充为发送您刚刚收到的数据包中的客户端的信息).

客户端也需要绑定端口,并用于recvfrom()从服务器返回数据包.

服务器端:

  • 绑定端口
  • 用包读取包 recvfrom()
  • sendto()使用返回的信息将数据包发送回客户端recvfrom()

客户端:

  • 绑定端口
  • 使用发送数据包到服务器 sendto()
  • 阅读回复 recvfrom()