【问题标题】:Creating a C server创建 C 服务器
【发布时间】:2019-12-26 12:35:58
【问题描述】:

我正在创建一个 C 服务器。它只显示一条消息,说明目前连接已正确建立:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stddef.h>
#include <unistd.h>

#include "utils.h"

int main(int argc, char* argv[]){
    int fd, fd_conn, result;
    struct sockaddr_in sock;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    exit_if(fd == -1, "socket");

    sock.sin_family = AF_INET;
    sock.sin_addr.s_addr = INADDR_ANY;
    sock.sin_port = htons(7000);
    bzero(&(sock.sin_zero),8); // 0 en el resto de la estructura

    result = bind(fd, (struct sockaddr *) &sock, sizeof(struct sockaddr_in));
    exit_if(result == -1, "bind");

    result = listen(fd, 5);
    exit_if(result == -1, "listen");

    fd_conn = accept(fd, NULL, NULL);
    exit_if(fd_conn == -1, "accept");

    printf("Connection established\n");

    close(fd_conn);
    close(fd);
}

显然,在执行时,它会等待传入的连接,但在使用 telnet 进行测试时:

telnet 127.0.0.1 7000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

【问题讨论】:

  • 也许有防火墙(在本地主机上?)如果您的服务器实际上正在监听,请检查netstat -ln
  • 不,它没有在听……
  • 我认为 bzero 行有问题。它在 exit_if "bind" 处为我中止。如果我在开始设置 sock.sin_* 之前将 bzero 替换为 memset(&amp;sock, 0, sizeof(struct sockaddr_in));,那么它对我有用。不过,我确实必须添加更多的头文件,并组成 exit_if(你还没有向我们展示 utils.h)——尝试使用 -Wall(或你的编译器的等效项)进行编译,并确保没有警告。跨度>
  • 它确实在听。在修复了像上面这样的小错误之后。
  • @Rup memset() 确实放错了地方。很奇怪,它似乎可以工作(取消初始化为零?)[我已将其添加到我的答案中,TNX]

标签: c server ipv4


【解决方案1】:

我修正了你的(微不足道的)错误:


#include <stdio.h> // for fprintf
#include <string.h> // for memset
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stddef.h>
#include <unistd.h>

// #include "utils.h"
#define exit_if(a,b) if(a) {fprintf(stderr, b);}  else

int main(int argc, char* argv[]){
    int fd, fd_conn, result;
    struct sockaddr_in sock;

    fd = socket(AF_INET, SOCK_STREAM, 0);
    exit_if(fd == -1, "socket");

    memset(&sock,0, sizeof sock); // <-- zero the complete struct.

    sock.sin_family = AF_INET;
    sock.sin_addr.s_addr = INADDR_ANY;
    sock.sin_port = htons(7000);
    memset(&sock.sin_zero,0, sizeof sock.sin_zero); // <<-- not needed anymore

    result = bind(fd, (struct sockaddr *) &sock, sizeof(struct sockaddr_in));
    exit_if(result == -1, "bind");

    result = listen(fd, 5);
    exit_if(result == -1, "listen");

    fd_conn = accept(fd, NULL, NULL);
    exit_if(fd_conn == -1, "accept");

    printf("Connection established\n");

    close(fd_conn);
    close(fd);

    return 0;
}

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2016-02-07
    • 2012-07-12
    • 2018-10-22
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多