2014-02-10 152 views
0

我目前正在使用在Linux中使用C語言的原始套接字編程。當我編譯程序時,沒有檢測到錯誤。但是,在運行該程序時,出現「Socket:Protocol not supported」錯誤。我使用的代碼如下。有人能幫我找到解決問題的辦法嗎?套接字:協議不支持錯誤

#include<sys/types.h> 
#include<sys/socket.h> 
#include<netinet/tcp.h> 
#include<arpa/inet.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<errno.h> 
#include<unistd.h> 
#include<netdb.h> 
#define P 25 

struct tcph { 
unsigned short int th_sport; 
unsigned short int th_dport; 
unsigned int th_seq; 
unsigned int th_ack; 
unsigned char th_x2:4, th_off:4; 
unsigned char th_flags; 
unsigned short int th_win; 
unsigned short int th_sum; 
unsigned short int th_urp; 
}; 

int main() 
{ 
int sock,connected,bytes_recieved,true=1; 
char send_data[1024],recv_data[1024]; 
struct sockaddr_in server_addr,client_addr; 
int sin_size; 

char datagram[4096]; 
struct tcph *tcph = (struct tcph *) datagram; 
tcph->th_sport = htons (1234); 
tcph->th_dport = htons (P); 
tcph->th_seq = random(); 
tcph->th_ack = 0; 
tcph->th_x2 = 0; 
tcph->th_off = 0;  
tcph->th_flags = 0; 
tcph->th_win = htonl (65535); 
tcph->th_sum = 0; 
tcph->th_urp = 0; 

if((sock=socket(AF_INET,SOCK_RAW,0))==-1) 
{ 
perror("Socket"); 
exit(1); 
} 
if(setsockopt(sock,IPPROTO_TCP,IP_HDRINCL,&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'; 
if(strcmp(recv_data,"q")==0||strcmp(recv_data,"Q")==0) 
{ 
close(connected); 
break; 
} 
else 
{ 
printf("\nRECIEVED DATA=%s",recv_data); 
} 
fflush(stdout); 
} 
} 
close(sock); 
return 0; 
} 

回答

0

您可能想查看D.J.伯恩斯坦的tcpserver(見http://cr.yp.to/ucspi-tcp/tcpserver.html)。基本上,您可以簡單地在tcpserver下運行C程序,並且tcpserver將處理所有事情,只要設置套接字,列出您使用的任何端口上的傳入連接等等。當傳入連接到達您指定的端口時, tcpserver會生成一個程序實例,並將來自客戶端的傳入信息傳遞給程序的STDIN,並將程序的STDOUT中的傳出信息傳回給客戶端。這樣,你就可以專注於你的程序的核心邏輯(並簡單地讀/寫標準輸出/標準輸入),並讓tcpserver處理所有繁重的操作,直到套接字等。

相關問題