UDP 服务器出现分段错误

发布于 2024-12-04 06:03:33 字数 1756 浏览 0 评论 0原文

我使用 UDP 编写了以下回显服务器,但我不知道为什么它在 sendto 函数中给我分段错误,它接收良好,但在将数据发送回客户端时出现问题。我已经尝试找到问题几个小时了,但一无所获。有人可以指出错误或我可能做错了什么吗? 谢谢

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define true 1
#define false 0

int main(int argc,char **args)
{
    int BUF_LENGTH=101;
    int port_no=1800;
    struct sockaddr_in serv_addr,rmt_addr;
    //rmt_addr=malloc(sizeof(struct sockaddr_in));
    char *buffer=malloc(BUF_LENGTH);
    int byte_recv=0;
    int rmt_length=0;

    int sock_id;
    sock_id=socket(AF_INET,SOCK_DGRAM,0);

    if(sock_id<0)
    {
        printf("Error creating socket : %d",sock_id);
        return -1;
    }

    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(port_no);
    serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

    bind(sock_id,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

    printf("Created\n");
    while(true)
    {
        printf("Waiting\n");
        byte_recv=recvfrom(sock_id,buffer,BUF_LENGTH,0,(struct sockaddr*)&rmt_addr,&rmt_length);

        printf("%s\n",buffer);
        if(byte_recv<0)
        {
            printf("Error receiving: %d",byte_recv);
            error("recvfrom");
            return -2;
        }

        printf("%d:%d %s\n",rmt_length,rmt_addr.sin_port,inet_ntoa(rmt_addr.sin_addr));

        byte_recv=sendto(sock_id,buffer,BUF_LENGTH,0,(struct sockaddr*)&rmt_addr,rmt_length); //The segmentation fault comes here

        printf("Bytes sent: %d \n",byte_recv);
        if(byte_recv<0)
            error("sendto");
    }

    free(buffer);
    return 0;
}

Ive written the following echo server using UDP but i have no idea that why it is giving me Segmentation Fault in sendto function, it receives fine but has problem sending data back to client. Ive been trying to find the problem for a few hours now but got no where. Can somebody please point out the fault or what i may be doing wrong.
Thanks

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define true 1
#define false 0

int main(int argc,char **args)
{
    int BUF_LENGTH=101;
    int port_no=1800;
    struct sockaddr_in serv_addr,rmt_addr;
    //rmt_addr=malloc(sizeof(struct sockaddr_in));
    char *buffer=malloc(BUF_LENGTH);
    int byte_recv=0;
    int rmt_length=0;

    int sock_id;
    sock_id=socket(AF_INET,SOCK_DGRAM,0);

    if(sock_id<0)
    {
        printf("Error creating socket : %d",sock_id);
        return -1;
    }

    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(port_no);
    serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

    bind(sock_id,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

    printf("Created\n");
    while(true)
    {
        printf("Waiting\n");
        byte_recv=recvfrom(sock_id,buffer,BUF_LENGTH,0,(struct sockaddr*)&rmt_addr,&rmt_length);

        printf("%s\n",buffer);
        if(byte_recv<0)
        {
            printf("Error receiving: %d",byte_recv);
            error("recvfrom");
            return -2;
        }

        printf("%d:%d %s\n",rmt_length,rmt_addr.sin_port,inet_ntoa(rmt_addr.sin_addr));

        byte_recv=sendto(sock_id,buffer,BUF_LENGTH,0,(struct sockaddr*)&rmt_addr,rmt_length); //The segmentation fault comes here

        printf("Bytes sent: %d \n",byte_recv);
        if(byte_recv<0)
            error("sendto");
    }

    free(buffer);
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

り繁华旳梦境 2024-12-11 06:03:33

这些台词:

error("recvfrom");

error("sendto");

不要做你认为他们做的事。您可能想说perror

此外,您没有正确初始化 rmt_length。试试这个:

int rmt_length=sizeof(rmt_addr);

最后,您回显的字节数比服务器接收到的字节数多。试试这个:

byte_recv=sendto(sock_id,buffer,byte_recv,0,(struct sockaddr*)&rmt_addr,rmt_length);

These lines:

error("recvfrom");

error("sendto");

don't do what you think they do. You probably meant to say perror.

Additionally, you aren't initializing rmt_length correctly. Try this:

int rmt_length=sizeof(rmt_addr);

Finally, you are echoing more bytes back than the server receives. Try this:

byte_recv=sendto(sock_id,buffer,byte_recv,0,(struct sockaddr*)&rmt_addr,rmt_length);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文