2011-04-18 46 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完全相同。