【发布时间】: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(&sock, 0, sizeof(struct sockaddr_in));,那么它对我有用。不过,我确实必须添加更多的头文件,并组成 exit_if(你还没有向我们展示 utils.h)——尝试使用-Wall(或你的编译器的等效项)进行编译,并确保没有警告。跨度> -
它确实在听。在修复了像上面这样的小错误之后。
-
@Rup memset() 确实放错了地方。很奇怪,它似乎可以工作(取消初始化为零?)[我已将其添加到我的答案中,TNX]