2013-11-26 97 views
0

有我试图在客户端/服务器模型,但分段错误执行代码来了..如何使用sendto()和rcvfrom()函数通过套接字传递结构对象?

服务器:

/*这就是我试图通过*/

结构
struct pkt{  
     char data[1000];   
     int seqNo; 
     int checksum; 
     void make_pkt(int seq,char dat[1000],int check) 
     { 
      seqNo=seq; 
      strcpy(data,dat); 
      checksum=check; 

     } 
    }; 

的主要部分是

main() /* main */ 
{ 
port=client_addr.sin_port; 
     cout<<"port : "<<port; 
     pkt *rcv=new pkt; 
     do{ 
      cout<<"a"<<endl; 
      cout<<"port : "<<port; 
      pkt *newpkt=new pkt; 
      char *buffer=new char [1000]; 
      strcpy(buffer,"Hamza"); 
      newpkt->make_pkt(1,buffer,2); 
      cout<<"aa"<<endl; 
      client_addr.sin_port=port; 
      cout<<"port 2 : "<<client_addr.sin_port<<endl; 
      sendto(sockfd,&newpkt,sizeof(struct pkt),0,(struct sockaddr *) &client_addr,sizeof(client_addr)); 

      cout<<"aaa"<<endl; 
      recvfrom(sockfd,&rcv,sizeof(struct pkt),0,(struct sockaddr *)&client_addr,&leng); 
      cout<<"bb :"<<rcv->seqNo<<endl; 
     }while(rcv->seqNo!=1); 
} 

客户端:

struct pkt{ 
    char data[1000]; 
    int seqNo; 
    int checksum; 
    pkt() 
    { 
     strcpy(data," "); 
     seqNo=0; 
     timer=0; 
     checksum=0; 
    } 
}; 
main() 
{ 
pkt *newpkt=new pkt; 
     do{ 
     cout<<"aa"<<endl; 
      pkt *rcvpkt=new pkt; 
      socklen_t lengt=sizeof(my_addr); 
      recvfrom(sockfd,&rcvpkt,sizeof(struct pkt),0,(struct sockaddr *)&my_addr,&lengt); 
      cout<<"aaa"<<endl; 
      cout<<"aaa"<<rcvpkt->data<<endl; 
      newpkt->seqNo=1; 
      sendto(sockfd,&newpkt,sizeof(struct pkt),0,(struct sockaddr *) &my_addr,sizeof(my_addr)); 

     }while(newpkt->seqNo!=1); 
} 

请告诉我这个代码是什么问题..?

+0

你告诉我们 - 这是什么问题?除了尝试通过流链接传递函数外。 –

+0

分段错误(核心转储)错误.. :( – Hamza

+0

)不要使用结构体作为网络协议,你引入了6个依赖关系,并限制了结构体可以包含的内容(无指针),定义一个八位字节的有线协议,代码发送和接收它 – EJP

回答

0

您没有正确传递结构实例到sendto()recvfrom()。你的pkt变量是指针,所以你在传递它们时需要去除&运算符。你也有内存泄漏。试试这个:

main() 
{ 
    port = ntohs(client_addr.sin_port); 
    cout << "port : " << port; 
    pkt *rcv = new pkt; 
    do{ 
     cout << "a" << endl; 
     cout << "port : " << port; 
     pkt *newpkt = new pkt; 
     char buffer[1000]; 
     strcpy(buffer,"Hamza"); 
     newpkt->make_pkt(1,buffer,2); 
     cout << "aa" << endl; 
     client_addr.sin_port = htons(port); 
     cout << "port 2 : " << ntohs(client_addr.sin_port) << endl; 
     sendto(sockfd, newpkt, sizeof(struct pkt), 0, (struct sockaddr *) &client_addr, sizeof(client_addr)); 
     delete newpkt; 

     cout << "aaa" << endl; 
     recvfrom(sockfd, rcv, sizeof(struct pkt), 0, (struct sockaddr *)&client_addr, &leng); 
     cout << "bb :" << rcv->seqNo << endl; 
    } 
    while(rcv->seqNo != 1); 
    delete rcv; 
} 

main() 
{ 
    pkt *newpkt = new pkt; 
    do{ 
     cout << "aa" << endl; 
     pkt *rcvpkt = new pkt; 
     socklen_t lengt = sizeof(my_addr); 
     recvfrom(sockfd, rcvpkt, sizeof(struct pkt), 0, (struct sockaddr *)&my_addr, &lengt); 
     cout << "aaa" << endl; 
     cout << "aaa" << rcvpkt->data << endl; 
     newpkt->seqNo = 1; 
     sendto(sockfd, newpkt, sizeof(struct pkt), 0, (struct sockaddr *) &my_addr, sizeof(my_addr)); 
     delete rcvpkt; 

    } 
    while(newpkt->seqNo != 1); 
    delete newpkt; 
} 
+0

非常感谢你这是有帮助的 – Hamza

相关问题