【问题标题】:Trying to implement TCP echo server in C尝试在 C 中实现 TCP 回显服务器
【发布时间】:2021-07-10 20:29:45
【问题描述】:

试图用 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, data_len, 0);
                data[data_len] = '\0';
                printf("Sent mesg: %s", data);
            }
        }
        printf("Client disconnected\n");
        close(new);
    }
    close(sock);
}

在使用 gcc (Debian 8.3.0-6) 8.3.0 在 Linux 中编译时,会引发以下警告/错误,

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, (struct sockaddr *)&client, 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);

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

【问题讨论】:

  • 嗨@akbharath-如果您查看手册页以接受错误是正确的-man7.org/linux/man-pages/man2/accept.2.html-int accept(int sockfd, struct sockaddr *restrict addr,socklen_t *restrict addrlen); 您是否可能忘记了sockaddr_len 上的&amp;-即&amp;sockaddr_len
  • data[data_len] = '\0';
  • while(data_len) 出错时 Data_len 将为 -1,导致循环运行直到无穷大。

标签: linux gcc tcp echo socklen-t


【解决方案1】:

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)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2014-02-21
    • 2020-12-16
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多