【发布时间】:2015-07-25 19:34:02
【问题描述】:
这是我编写的用于创建套接字并将其绑定到地址和端口的代码:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <strings.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
const char APPRESSMESSAGE[] = "APRESS,For Profesionals By Professional!\n";
int SimpleSocket = 0;
int SimplePort = 0;
if (argc != 2)
{
fprintf(stderr, "USAGE: %s <port>\n", argv[0]);
exit(1);
}
SimpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (SimpleSocket == -1)
{
fprintf(stderr, "Could not create the socket !\n");
exit(2);
}
else
{
fprintf(stdout, "socket created\n");
}
SimplePort = atoi(argv[1]);
struct sockaddr_in SimpleServer;
bzero(&SimpleServer, sizeof(SimpleServer));
SimpleServer.sin_family = AF_INET;
SimpleServer.sin_addr.s_addr = htonl(INADDR_ANY);
SimpleServer.sin_port = htons(SimplePort);
int return_status;
return_status = bind(SimpleSocket, (struct sockaddr *)&SimpleServer, sizeof(SimpleServer));
if (return_status == 0)
{
fprintf(stdout, "bind completed\n");
}
else
{
fprintf(stderr, "could not bind to socket\n");
close(SimpleSocket);
exit(1);
}
return 0;
}
在这里,我期望输出是:
socket created
bind completed.
但结果是“无法绑定到套接字”。 这可能是什么原因?
【问题讨论】:
-
您查看过
bind的文档吗?它对返回状态和错误有什么说明? -
成功时返回零。
-
好吧,失败时,errno 是什么?
-
如果不是0,检查errno找出失败的原因。如果没有 errno,我们就有数百种可能性。很可能是您想要的端口已被占用。另一种可能性是 atoi 无法转换的错误输入导致您尝试绑定端口 0。首选 strtol 而不是 atoi,因为 strtol 会在转换失败时告诉您。
-
另外,你的缩进是错误的......“不是最佳的”,这使得代码难以遵循:(。
标签: c linux sockets networking