我在Unix中创建端口时遇到了麻烦。这段代码不断返回“创建socket(3)的错误”,这没有任何意义,因为sockfd必须小于0才能打印错误行。
server.c:
int main (int argc, char **argv)
{
int sockfd;
struct sockaddr_in server_sockaddr;
char buff[TRANSFER_BUFFER_LEN];
/* check number of command line arguments */
if (argc < 2)
{
fprintf (stderr, "Usage: %s <port>\n");
exit (EXIT_FAILURE);
}
/* create server socket */
if ((sockfd = createUdpSocket (&sockfd,
&server_sockaddr,
atoi (*(argv + 1)))
) < 0);
{
fprintf (stderr, "Error creating socket (%d).\n", sockfd);
exit (EXIT_FAILURE);
}
...
return 0;
}
socket_utils.h:
int createUdpSocket (int *sockfd, struct sockaddr_in *client_sockaddr, int port)
{
/* create socket */
if ((*sockfd = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
return -1;
memset (client_sockaddr, 0, sizeof (struct sockaddr_in));
client_sockaddr->sin_family = AF_INET;
client_sockaddr->sin_addr.s_addr = htonl (INADDR_ANY);
client_sockaddr->sin_port = htons (port);
/* bind socket */
if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd)))
{
close (*sockfd);
return -2;
}
return *sockfd;
}
有什么想法吗?这个功能在我的客户端程序中运行正常,它不接受端口值(而是取0)。
干杯,
里斯
答案 0 :(得分:6)
if ((sockfd = createUdpSocket (&sockfd,
&server_sockaddr,
atoi (*(argv + 1)))
) < 0);
哎呀,分号来自哪里?你有一个偷渡者!
此外,此行不会达到预期效果:
if (!bind (*sockfd, (struct sockaddr*) &client_sockaddr, sizeof (sockfd)))
成功时bind()
函数返回0,失败时返回-1。您的测试是向后的,并且在绑定成功而不是失败时会出错。您说&
的位置也不正确&client_sockaddr
。第三个参数需要是sockaddr_in
结构的大小,而不是sizeof(sockfd)
。尝试:
if (bind (*sockfd, (struct sockaddr*) client_sockaddr, sizeof (struct sockaddr_in)) != 0)
当我们在这里时,你的用法打印输出缺少argv[0]
参数:
fprintf (stderr, "Usage: %s <port>\n");
答案 1 :(得分:0)
看起来你有太多的括号让代码和你自己感到困惑....另外,这是一个有用的guide来理解网络编程与套接字的礼貌......