亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2441 | 回復(fù): 4
打印 上一主題 下一主題

linux下網(wǎng)絡(luò)編程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-05-27 15:39 |只看該作者 |倒序?yàn)g覽
跪求。。!各位大俠,幫幫忙,這個(gè)問(wèn)題我查了很長(zhǎng)時(shí)間了,現(xiàn)在我大致知道問(wèn)題出在哪里,可能是我main()函數(shù)里面的申請(qǐng)內(nèi)存的問(wèn)題。先說(shuō)一下,因?yàn)槲铱蛻舳说某绦虮容^長(zhǎng),所以我就不在這里貼出來(lái)了,我只貼相關(guān)部分的。服務(wù)器端代碼都有。問(wèn)題如下:我使用客戶端給服務(wù)器傳送一個(gè)結(jié)構(gòu)體,然后在服務(wù)器端用多線程對(duì)這個(gè)結(jié)構(gòu)體進(jìn)行處理,所以我在服務(wù)器端的main函數(shù)里面動(dòng)態(tài)的申請(qǐng)內(nèi)存,然后把這個(gè)指針傳出去,但是我發(fā)現(xiàn)有問(wèn)題,然后我就改在main函數(shù)里面申請(qǐng)指針然后再釋放指針,發(fā)現(xiàn)有問(wèn)題了。程序能夠運(yùn)行,有時(shí)運(yùn)行幾秒,有時(shí)運(yùn)行幾分鐘,然后都是在服務(wù)器端出現(xiàn)segmention fault。請(qǐng)好心人幫幫忙,我已經(jīng)花了很長(zhǎng)時(shí)間在上面了。
服務(wù)器端代碼
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<sys/wait.h>
typedef  unsigned char  u8_t ;
typedef  unsigned short u16_t ;
typedef  unsigned int         u32_t ;
typedef  unsigned long long u64_t ;


int serv_port=9999;
typedef struct __ether_header_t {
//#define     ZERO_DATA_RESERVE_LEN       2
//   u8_t    reserve[ZERO_DATA_RESERVE_LEN] ;
    u8_t    dmac[6];
    u8_t    smac[6];
    u16_t   ether_type;
  }ether_header_t;
  
typedef struct _ip_header_t{
#if defined(__LITTLE_ENDIAN_BITFIELD)
    u8_t    ihl:4, version:4;
#else defined (__BIG_ENDIAN_BITFIELD)
    u8_t    version:4, ihl:4;
#endif
    u8_t    tos;
    u16_t   tot_len;
    u16_t   id;
    u16_t   frag_off;
    u8_t    ttl;
    u8_t    protocol;
    u16_t   check;
    u32_t   saddr;
    u32_t   daddr;
}ip_header_t;
typedef struct _sock_packet_info{
    struct timeval stamp;
    //recieved packet length
    unsigned short  pkt_len;
#define     ZERO_MAX_RESERVE_DATA_LEN   2028
    unsigned char   data [ZERO_MAX_RESERVE_DATA_LEN];
}sock_packet_info_t;
int _tcp_listen(unsigned short serv_port){
        int sockfd;
        int addrlen = sizeof(struct sockaddr_in);
        struct sockaddr_in servaddr;

int on=1;

        if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0){                //create socket
                printf("socket() failed, return...\n");
                return -1;
        }
printf("socket success\n");
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

        bzero(&servaddr, sizeof(servaddr));                                //server's address
        servaddr.sin_family = PF_INET;
        servaddr.sin_port = htons(serv_port);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
                                                                                       
        if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){        //bind to server's address
                printf("bind() failed, return...\n");
                return -1;
        }
       
        if(listen(sockfd, 10) < 0)                                        //create listenning queue
        {
                printf("listen() failed, return...\n");
                return -1;
        }

        printf("Waiting for data on port TCP %u\n", serv_port);

        return sockfd;       
}


int _tcp_accept(int sockfd){
        int newfd;
        int addrlen = sizeof(struct sockaddr_in);
        struct sockaddr_in clientaddr;
       
        if((newfd = accept(sockfd, (struct sockaddr*)&clientaddr, &addrlen)) < 0)
        {
                printf("accept() failed, /////return...\n");
                return -1;
        }

        return newfd;
}



int _tcp_recv(int sockfd, char *buf, int buf_len){
        int msg_len;
       
        msg_len = recv(sockfd, buf, buf_len, 0);
        if( msg_len < 0 )
        {
                printf("recv() failed, return...\n");
                return -1;
        }

        printf("Received message length from tcp is: %d\n", msg_len);

        return msg_len;
}



int        main(int argc,char *argv[])
{


int client_fd;
int serv_fd;

int ret;
pid_t pid;
//struct sockaddr_in client_addr;
int client_len;
int msglen,buf_len;
u_char buf[2040];//這里要定義大小。很重要(搞了好幾天,一定要注意大。
sock_packet_info_t *pPacket,*ppkt;
ip_header_t *pheader;

struct in_addr  in;

   serv_fd=_tcp_listen(serv_port);
if(serv_fd<0)
        {
                exit(1);
        }
client_fd=_tcp_accept(serv_fd);
if(client_fd<0)
{
close(serv_fd);
exit(2);
}
while ( 1 )
{
        msglen=_tcp_recv(client_fd,buf,sizeof(buf));
        if(msglen<0)
                exit(1);
  
   if(msglen==0)
  {
    close(client_fd);
    break;
   }
//  buf[msglen]='\0';

         pPacket=(sock_packet_info_t *)malloc(sizeof(sock_packet_info_t ));   
         ppkt=(sock_packet_info_t *)buf;
  pPacket->stamp.tv_sec=ppkt->stamp.tv_sec;  
  pPacket->stamp.tv_usec=ppkt->stamp.tv_usec;  
                pPacket->pkt_len=ppkt->pkt_len;
        memcpy(pPacket->data,ppkt->data,ppkt->pkt_len);
printf("time:%u\n",pPacket->stamp.tv_sec);
                //debug("get a packet %d %d \n", SRCPORT(pPacket->data+16), DSTPORT(pPacket->data+16));
        pheader=(ip_header_t *)(pPacket->data+14);
//pheader=(ip_header_t *)(buf);
printf("addr:%u,\n",ntohl(pheader->saddr));
printf("protocol: %d\n",pheader->protocol);
free(pPacket);



}

        return 0 ;
}


客戶端部分代碼

void dispose_packet(u_char *p,const struct pcap_pkthdr *header,const u_char *packet_content)
{
  tcp_flags=0;
        struct ether_header *ether_protocol;
        struct ip_header *ip_protocol;
        struct tcp_header *tcp_protocol;
        struct udp_header *udp_protocol;
     sock_packet_info_t *pPacket;
        unsigned short ether_type;
        PACKET pkt_header;
         int size_ip;
        int size_tcp;
        u_char buf[100];
        int len;
struct  in_addr in;
        ether_protocol=(struct ether_header *)(packet_content);
        ether_type=ntohs(ether_protocol->ether_type);
        if(ether_type!=0x800)//不是ip協(xié)議就返回,我們處理的tcp、udp、ICMP的包頭都是IP
                return;
        ip_protocol=(struct ip_header *)(packet_content+14);
        size_ip=ip_protocol->ip_header_length*4;
        if(size_ip<20)
        {
                printf("Invalid IP header length");
            return;
        }
   pkt_header.Timestamp.tv_sec=header->ts.tv_sec;
   pkt_header.Timestamp.tv_usec=header->ts.tv_usec;
   pkt_header.SIP=ntohl(ip_protocol->ip_source_addr);
   pkt_header.DIP=ntohl(ip_protocol->ip_destination_addr);
   pkt_header.Proto=ip_protocol->ip_protocol;

if(ip_protocol->ip_protocol==6)//協(xié)議為TCP
        {
                tcp_protocol=(struct tcp_header *)(packet_content+14+size_ip);
        pkt_header.SPort=ntohs(tcp_protocol->tcp_source_port);
               
        pkt_header.DPort=ntohs(tcp_protocol->tcp_destination_port);
        tcp_flags=tcp_protocol->tcp_flags;
                // printf("tcp_flags:%d\n",tcp_flags);

        }
        if(ip_protocol->ip_protocol==17)
        {
                udp_protocol=(struct udp_header *)(packet_content+14+size_ip);
                pkt_header.SPort=ntohs(udp_protocol->udp_source_port);
        pkt_header.DPort=ntohs(udp_protocol->udp_destination_port);
        }




        int decision=0;
if(RPS(&pkt_header)==1)
decision=1;
if(FSH(&pkt_header)==1)
decision=1;
if(Protos_flags(&pkt_header))
decision=1;
else if(FFS(&pkt_header))
decision=1;

if(decision)
{
pPacket=(sock_packet_info_t *)malloc(sizeof(sock_packet_info_t));
               
pPacket->stamp.tv_sec=header->ts.tv_sec;

pPacket->stamp.tv_usec=header->ts.tv_usec;

pPacket->pkt_len=ntohs(ip_protocol->ip_lenth);

printf("ntohs(ip_protocol->ip_lenth):%d\n",ntohs(ip_protocol->ip_lenth));
memcpy(pPacket->data,packet_content,ntohs(ip_protocol->ip_lenth));

printf("connected ok\n");
printf("time:%u\n",pPacket->stamp.tv_sec);
        ip_protocol=(struct ip_header *)(pPacket->data+14);
printf("sddr:%u\n",ntohl(ip_protocol->ip_source_addr));
in.s_addr=ip_protocol->ip_source_addr;
        printf("soucrce addr:%s\n",inet_ntoa(in));

len=_tcp_send(sockfd,pPacket,sizeof(sock_packet_info_t));

//len=_tcp_send(sockfd,packet_content,ntohs(ip_protocol->ip_lenth));

        if(len<0)
                {exit(1);
                }
printf("send to monster\n");

free(pPacket);
}



}

int  main()
{       
   int i=0;

        char *dev = NULL;
//        char *filter_exp = NULL;
        char errbuf[PCAP_ERRBUF_SIZE];
        bpf_u_int32 mask;
        bpf_u_int32 net;
        pcap_t *handle;       
        struct itimerval value;
        int num_packets = 2000;       
//        struct bpf_program fp;




srand(time(0));
dev ="eth1";
        if (pcap_lookupnet(dev,&net, &mask, errbuf) == -1)
        {
                fprintf(stderr, "Can't get netmask for device %s\n", dev);
                net = 0;
                mask = 0;
        }
        handle = pcap_open_live(dev, SNAP_LEN, 1, 1000, errbuf);
        if (handle == NULL)
        {
                fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf);
                return(2);
        }

        if((sockfd=_tcp_connect(9999,"127.0.0.1"))<0)
                {
              exit(2);
                }
    while(1)
     {

     pcap_loop(handle,1,dispose_packet,NULL);
    i++;
     }


     printf("sucess");
return 0;
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-05-27 17:25 |只看該作者
buf 可能是它的問(wèn)題將

由于你沒(méi)有動(dòng)態(tài)
free(pPacket)后
將他搞成"0";
memset(buf,0,sizeof(buf));
pPacket = NULL;

程序上應(yīng)該沒(méi)有什么問(wèn)題;

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-05-28 22:33 |只看該作者
回復(fù) 2# awe4


    不行呀,我加了之后,運(yùn)行了10分鐘,然后又是segmention fault,

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-05-31 15:54 |只看該作者
還懷疑是:u_char buf[2040];的問(wèn)題你數(shù)一下字節(jié)數(shù)你強(qiáng)轉(zhuǎn)之后
在有可能由于編譯器對(duì)齊(4字節(jié)對(duì)齊)這個(gè)結(jié)構(gòu)就是2050
sock_packet_info_t 大小應(yīng)該是/*2048*/
{
    struct timeval stamp; /*8*/
    //recieved packet length
    unsigned short  pkt_len;/*2*/
        #define     ZERO_MAX_RESERVE_DATA_LEN   2028
    unsigned char   data [ZERO_MAX_RESERVE_DATA_LEN];
}

建議不要這樣用哦
直接這樣搞吧:
ppkt =  (sock_packet_info_t*)malloc(sizeof(struct sock_packet_info_t));
直接用他也不錯(cuò).
你自己調(diào)試一下啊.各個(gè)地方+打印看看哪里segment 了

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-05-31 17:21 |只看該作者
代碼太亂了。。?床幌氯
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP