【问题标题】:Segmentation fault in a simple UDP server/client简单 UDP 服务器/客户端中的分段错误
【发布时间】:2022-01-05 19:31:15
【问题描述】:

我试图弄清楚如何用 C 语言做一个简单的 UDP 服务器。 我会尝试在函数的参数中给出消息以获得更好的版本。

但是我一直遇到一些基本的分段错误,我不知道这是从哪里来的,即使我尝试使用“if(error == -1)”语句进行调试。

这是我的服务器

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#define PORT 3000
#define MAXLINE 1000

int main(int argc, char const *argv[])
{
   char buffer[100]; 
   char *message ="hello world";  
   int udp_socket,len;
   struct sockaddr_in servaddr,cliaddr;
   
   //socket
   udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
   if (udp_socket<0){
       printf("erreur de création de socket");
       exit(-1);
   } 

   //bind 
   servaddr.sin_family = AF_INET;
   servaddr.sin_port = htons(PORT);
   servaddr.sin_addr.s_addr = INADDR_ANY;
   int error;
   error = bind(udp_socket, (struct sockaddr *)&servaddr, sizeof servaddr);
   if(error == -1){
       printf ("cannot get port %d",PORT);
       exit(-1);
   }

   //recvfrom
   len = sizeof(cliaddr);
   int error2 = recvfrom(udp_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&cliaddr,&len);
    if(error2 <0){
       printf ("erreur recvfrom");
       exit(-1);
   }

   message[error2]='\0';
   puts(message);
   return 0;
   int k = sendto(udp_socket,message,MAXLINE,0,(struct sockaddr*)&cliaddr,sizeof(cliaddr));
   if (k>0) {
       printf ("error sendto");
       exit(-1);
   }
} 

这是我的客户

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>

#define PORT 3000
#define MAXLINE 1000

int main(){

    char *message = "this is a test\n ";
    int port = 3000;
    char buffer[100];

    int sockfd,n;
    struct sockaddr_in servaddr;
    //clear servaddr

    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_port = htons(PORT);
    servaddr.sin_family = AF_INET;
    
    //create datagram socket
    sockfd =socket(AF_INET,SOCK_DGRAM,0);

   // connect to server
    if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
        printf("\n Error : Connect Failed \n");
        exit(0);
    }
    // request to send datagram
    // no need to specify server address in sendto
    // connect stores the peers IP and port
    sendto(sockfd, message, MAXLINE, 0, (struct sockaddr*)NULL, sizeof(servaddr));
    
    // waiting for response
    recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)NULL, NULL);
    puts(buffer);
  
    // close the descriptor
    close(sockfd);
}

【问题讨论】:

    标签: c networking udp


    【解决方案1】:

    您发送的字节数比缓冲区多。

    在您的两个服务器中:

    int k = sendto(udp_socket,message,MAXLINE,0,(struct sockaddr*)&cliaddr,sizeof(cliaddr));
    

    和客户:

    sendto(sockfd, message, MAXLINE, 0, (struct sockaddr*)NULL, sizeof(servaddr));
    

    您告诉他们发送MAXLINE 字节,但message 没有指向该长度的字符串。这意味着您正在阅读字符串的末尾,触发undefined behavior

    在这两种情况下,发送strlen(message)+1 字节。这将只发送字符串中的字符加上终止的空字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多