我在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\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).
干杯,
里斯
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\n");