2014-02-12 126 views
0

我正在使用C編程語言在Ubuntu的原始套接字程序中工作。由於我使用原始套接字,因此我需要使用SOCK_RAW類型而不是SOCK_STREAM。反過來利用SOCK_RAW通過投擲Listen:Operation不支持的錯誤

"Listen:Operation not supported error". 

我該怎麼做來糾正這種禁止我使用的listen()? 下面是我的工作代碼:

<header files> 
. 
. 
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))==-1) 
{ 
perror("Socket"); 
exit(1); 
} 
if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&true,sizeof(true))==-1) 
{ 
perror("Setsockopt"); 
exit(1); 
} 
server_addr.sin_family=AF_INET; 
server_addr.sin_port=htons(9392); 
server_addr.sin_addr.s_addr=INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 
if(bind(sock,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1) 
{ 
perror("Unable to bind"); 
exit(1); 
} 
if(listen(sock,5)==-1) 
{ 
perror("Listen"); 
exit(1); 
} 
printf("\nTCP Server waiting for client on port 9392"); 
fflush(stdout); 
while(1) 
{ 
sin_size=sizeof(struct sockaddr_in); 
connected=accept(sock,(struct sockaddr *)&client_addr,&sin_size); 
printf("\nI got a connection from (%s,%d)",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); 
while(1) 
{ 
printf("\nSEND (q or Q to quit):"); 
scanf("%s",send_data); 
if(strcmp(send_data,"q")==0||strcmp(send_data,"Q")==0) 
{ 
send(connected,send_data,strlen(send_data),0); 
close(connected); 
exit(0); 
} 
else 
send(connected,send_data,strlen(send_data),0); 
bytes_recieved=recv(connected,recv_data,1024,0); 
recv_data[bytes_recieved]='\0'; 
. 
. 
. 
.  
+0

它沒有意義調用'在原始套接字listen',因爲原始套接字不能接受的連接。你想做什麼? – immibis

回答

0

這是因爲「聽()」不支持原始套接字。

This

This

+0

感謝yoU!得到它了! – viz26