【发布时间】:2023-03-19 02:24:01
【问题描述】:
对于一个学校项目,我必须使用套接字来创建服务器,我想我设法做到了,但我应该使用 Telnet 来测试它,每当我尝试时,我都会得到
telnet:连接到地址 0.0.0.0:连接被拒绝
所以我猜是我的 IP 错了。
我的代码的简化版本应该仍然适用于一个连接是
int main(int argc , char *argv[])
{
int sock;
int fd = 0;
int err = 0;
struct sockaddr_in sock_data;
socklen_t addr_size;
char *path;
path = get_current_dir_name();
if (argc == 2)
printf("%s", Usage);
sock = socket(AF_INET , SOCK_STREAM , 0);
if (sock == -1) {
printf("Could not create socket");
return (84);
}
memset(&sock_data, 0, sizeof(struct sockaddr_in));
sock_data.sin_family = AF_INET;
sock_data.sin_port = htons(5133);
sock_data.sin_addr.s_addr = htonl(INADDR_ANY);
printf("%s, %s, %s\n", path, sock_data.sin_addr, inet_ntoa(sock_data.sin_addr));
if (bind(sock, (const struct sockaddr *) &sock_data, sizeof(sock_data)) == -1)
printf("Error with binding\n");
if (listen(sock, LISTEN_BACKLOG) == -1)
printf("Error with listen");
addr_size = sizeof(struct sockaddr_in);
err = accept(sock, (struct sockaddr *) &sock_data, &addr_size);
while ((sock = accept(sock, NULL, NULL)) < 0)
err = 0;
return 84;
}
我看到了这个链接:TCP sockets in c 这很清楚,但我仍然不明白我应该如何测试我的程序
而且我越努力,我就越确信我一定犯了一个愚蠢的错误。
那么你知道我哪里出错了吗?
【问题讨论】:
-
附带说明,
accept(sock, (struct sockaddr *) &sock_data, &addr_size)需要移动到while循环内(或删除,因为accept(sock, NULL, NULL)已经在循环内就足够了)。但是,你不是close()'ing 任何由accept()返回的描述符。而且,在sock = accept(sock, NULL, NULL)中,您正在重新分配sock,因此无法访问您的侦听套接字(您也不是close'ing())。您需要为侦听和接受的套接字使用单独的描述符变量。 -
谢谢!我是使用套接字的新手,这很有帮助!如果您有其他建议,请不要犹豫;)