c-UDP中的分段故障



我在UDP中编写客户端-服务器项目时遇到了分段错误问题。这种情况发生在服务器端,当我从客户端接收到一个数据包并准备发回ACK时。我试图搜索解决方案,得到了UDP服务器给出的分段故障和C并发UDP套接字,奇怪的分段故障,但似乎这两个都不是我想要的答案。

这是我的服务器端代码

#include <ctype.h>          /* for toupper */
#include <stdio.h>          /* for standard I/O functions */
#include <stdlib.h>         /* for exit */
#include <string.h>         /* for memset */
#include <sys/socket.h>     /* for socket, sendto, and recvfrom */
#include <netinet/in.h>     /* for sockaddr_in */
#include <unistd.h>         /* for close */
#define STRING_SIZE 1024
#define SERV_UDP_PORT 12311

int main(void) {
   int sock_server; 
   struct sockaddr_in server_addr;  
   unsigned short server_port;  
   struct sockaddr_in client_addr; 
   unsigned int client_addr_len;  
   char sentence[STRING_SIZE];  
   char modifiedSentence[STRING_SIZE]; 
   unsigned int msg_len;  
   int bytes_sent, bytes_recd;
   unsigned int i;  
   struct Pkt
   {
     short length;
     short seqnum;
     char databytes[80];
   }; 
   struct Pkt* pkt;
    int  j ;      //for loop
    int seq;
    short num_of_bytes;
    //char ack_num[2];

   struct Ack
   {
    short ack_num;
   };
   struct Ack* ack;


   /* open a socket */
   if ((sock_server = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
      perror("Server: can't open datagram socketn");
      exit(1);
   }
   /* initialize server address information */
   memset(&server_addr, 0, sizeof(server_addr));
   server_addr.sin_family = AF_INET;
   server_addr.sin_addr.s_addr = htonl (INADDR_ANY);  
   server_port = SERV_UDP_PORT; 
   server_addr.sin_port = htons(server_port);
   /* bind the socket to the local server port */
   if (bind(sock_server, (struct sockaddr *) &server_addr,
                                    sizeof (server_addr)) < 0) {
      perror("Server: can't bind to local addressn");
      close(sock_server);
      exit(1);
   }
   /* wait for incoming messages in an indefinite loop */
   printf("Waiting for incoming messages on port %hunn", 
                           server_port);
   client_addr_len = sizeof (client_addr);
   for (;;) {
      bytes_recd = recvfrom(sock_server, pkt, sizeof(*pkt), 0, (struct sockaddr *) &client_addr, &client_addr_len);
      ack->ack_num = pkt->seqnum;
      printf("%02dn", ack->ack_num);
      num_of_bytes = pkt->length;
      printf("The sequence number is: %dn", ack->ack_num);
      printf("Received Sentence is: %sn     with length %dnn", pkt->databytes, num_of_bytes);
      msg_len = 3;

      /* send message */
      bytes_sent = sendto(sock_server, (struct Ack*)&ack, msg_len, 0, (struct sockaddr*) &client_addr, client_addr_len);      //Here is the segmentation fault comes from
   }
}

我不是很擅长C,所以如果代码很傻,请原谅我。请指出任何错误或看起来很奇怪的地方。提前感谢您的帮助。

pkt是指向Pkt的指针,但您尚未初始化它。ack也是如此。您可以a)malloc为Pkt并将结果分配给pkt,或者b)将pkt更改为Pkt结构(而不是指针)。第二种选择看起来像:

struct Pkt pkt;
struct Ack ack;
bytes_recd = recvfrom(sock_server, &pkt, sizeof(pkt), 0, (struct sockaddr *) &client_addr, &client_addr_len);
ack.ack_num = pkt.seqnum;
printf("%02dn", ack.ack_num);
num_of_bytes = pkt.length;
printf("The sequence number is: %dn", ack.ack_num);
printf("Received Sentence is: %sn     with length %dnn", pkt.databytes, num_of_bytes);
/* send message */
bytes_sent = sendto(sock_server, &ack, sizeof(ack), 0, (struct sockaddr*) &client_addr, client_addr_len);

最新更新