微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试在 C 中实现 TCP 回显服务器

如何解决尝试在 C 中实现 TCP 回显服务器

试图用 C 实现一个 TCP 回显服务器,并在搜索网络时遇到了这段代码并试图编译它。它显示了一些与 socket.h 相关的错误

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

#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024

int main(int argc,char **argv)
{
    struct sockaddr_in server;
    struct sockaddr_in client;
    int sock;
    int new;
    int sockaddr_len = sizeof(struct sockaddr_in);
    int data_len;
    char data[MAX_DATA];

    if((sock = socket(AF_INET,SOCK_STREAM,0)) == ERROR)
    {
        perror("server socket: ");
        exit(-1);

    }
    server.sin_family=AF_INET;
    server.sin_port=htons(atoi(argv[1]));
    server.sin_addr.s_addr=INADDR_ANY;
    bzero(&server.sin_zero,0);

    if((bind(sock,(struct sockaddr *)&server,sockaddr_len)) == ERROR)
    {
        perror("bind: ");
        exit(-1);

    }
    if((listen(sock,MAX_CLIENTS)) == ERROR)
    {
        perror("listen");
        exit(-1);

    }
    while(1)
    {
        if((new = accept(sock,(struct sockaddr *)&client,sockaddr_len)) == ERROR)
        {
            perror("accept");
            exit(-1);
        }
        printf("New Client connected from port no %d and IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr));
        data_len = 1;
        while(data_len)
        {
            data_len = recv(new,data,MAX_DATA,0);
            if(data_len)
            {
                send(new,data_len,0);
                data[data_len] = '\0';
                printf("Sent mesg: %s",data);
            }
        }
        printf("Client disconnected\n");
        close(new);
    }
    close(sock);
}

在 Linux 中使用 gcc (Debian 8.3.0-6) 8.3.0 编译时抛出警告/错误

tcp_srv.c: In function ‘main’:
tcp_srv.c:50:54: warning: passing argument 3 of ‘accept’ makes pointer from integer without a cast [-Wint-conversion]
   if((new = accept(sock,sockaddr_len)) == ERROR)
                                                      ^~~~~~~~~~~~
In file included from tcp_srv.c:4:
/usr/include/x86_64-linux-gnu/sys/socket.h:233:28: note: expected ‘socklen_t * restrict’ {aka ‘unsigned int * restrict’} but argument is of type ‘int’
      socklen_t *__restrict __addr_len);

二进制文件在执行时给出了一个分段错误,我认为这是由于这个错误。尝试使用谷歌搜索错误,但无法获得任何解决方案。

解决方法

accept 原型是:

     int accept(int socket,struct sockaddr *restrict address,socklen_t *restrict address_len);

和手册说:

address_len 是一个值-结果参数;它应该最初 包含 地址指向的空间量;返回时它将包含实际长度 返回的地址(以字节为单位)。

第三个参数必须是指向 socklen_t 的指针,因此:

if((new = accept(sock,(struct sockaddr *)&client,&sockaddr_len)) == ERROR)
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。