2011-04-18 66 views
0

我需要有一个插座(或IPC的其他方法)与以下行为:如何制作“粗心”套接字?

  1. 作家需要能够发送 数据套接字但没有阻挡

  2. 如果没有人听中, 数据被丢弃

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

我做了什么:

创造了一个通过调用

sock = socket (PF_LOCAL, SOCK_DGRAM, 0); //sock is an integer 

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)); 

绑定它停飞然后在其上

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); 

跟踪outputshows做了民意调查那令状e被执行(重复)。 要在它听我这样做:

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); 
} 

然而,“收到......”从不打印。

什么需要更改以实现所需的功能? 最后一个循环的条款应该是什么? (我正在使用一个简单的“现在运行1000次”)。

回答

8

呃,我想你需要读一下UDP套接字。

它们是无连接的。您只需将数据包发送到目的地,并希望有人在收听。

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

客户端还需要绑定端口,并使用recvfrom()从服务器获取数据包。

服务器端:

  • 绑定端口
  • recvfrom()
  • 读取数据包
  • 发送带有sendto()回包使用信息从recvfrom()

客户端返回的客户:

  • 绑定端口
  • 数据包发送给服务器sendto()
  • 回复阅读与recvfrom()
+0

所以。 a)绑定接收端而不是连接b)使用sendto()和recvfrom()而不是读写? 立即尝试。 – Srv19 2011-04-18 17:11:09

+0

但你刚才描述了一个连接。建立双向通信,其中服务器a)等待客户端的请求到达b)根据收到的信息向他发送数据。 这不是我所问过的。 – Srv19 2011-04-18 20:31:20

+1

有*无*连接。什么都没有建立。您正在使用UDP。这涵盖了你的问题中的1)和2)。 3)取决于你如何实现这一点。没有“连接”,所以客户端真的只是发送一个请求,服务器会回复。你不知道是否任何一方接收到消息,当然......因为你使用的是UDP。你需要围绕这个建立逻辑。 – 2011-04-18 20:34:48

0

我喜欢的玩具在交互式Python外壳插座,这是很能说明问题。使用UDP套接字查看问题的基本解决方法:

#-- setup receiving on client 
>>> from socket import * 
>>> 
>>> rsock = socket(AF_INET, SOCK_DGRAM) 
>>> rsock.bind(("127.0.0.1", 7888)) 
>>> rsock.recv(100) 

客户端数据块正在等待数据。好,让我们去发送一些东西给它!

#-- server 
>>> from socket import * 
>>> 
>>> sock = socket(AF_INET, SOCK_DGRAM) 
>>> sock2.sendto("hello", ("127.0.0.1", 7888)) 
5 
>>> 

好的,已发送消息。切换到客户端控制台并查看'hello';)试一试,这真的很有趣。


顺便说一句,PF_INET不是强制性的,SOCK_DGRAMs的工作方式与PF_UNIX完全相同。