【发布时间】:2015-07-28 06:04:36
【问题描述】:
我正在用 C 语言编写程序,我必须使用套接字吗? 如果我使用通用 IP (INADDR_ANY),客户端可以成功建立与服务器的连接,但如果我使用其他 IP,例如“192.168.1.100”,则连接失败。
服务器->
int sock = socket(AF_INET, SOCK_STREAM, 0), fd_sock, dim, dim1;
struct sockaddr_in my_addr, *client = (struct sockaddr_in*) malloc (sizeof(struct sockaddr_in));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = inet_addr("192.168.1.200");
bind(sock, (struct sockaddr *) &my_addr, sizeof(my_addr));
listen(sock, N*N);
while(1){
fd_sock = accept(sock, (struct sockaddr *)client, &dim1);
dim = read(fd_sock, buf, 100);
buf[dim] = '\0';
write(STDOUT_FILENO, buf, dim);
close(fd_sock);
}
close(sock);
客户->
int port = atoi(argv[2]) // I give the port as second argument from code line
char *ip = malloc(15); // I give IP as first argument from code line
strcpy(ip, argv[1]);
int sock = socket(AF_INET, SOCK_STREAM, 0), fd_sock;
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = inet_addr("192.168.1.200");
connect(sock, (struct sockaddr *) &my_addr, sizeof(my_addr));
write(sock, ip, 15);
如果不是
my_addr.sin_addr.s_addr = inet_addr("192.168.1.200");
我用
my_addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
在客户端和服务器上,socket 连接都可以正常工作。
有什么解决办法吗?
【问题讨论】:
-
哪些IP地址分配给服务器的接口?
-
你不是真的在做
... = inet_addr(INADDR_ANY);,是吗? -
如果服务器带有
192.168.1.100,您将无法在192.168.1.200下访问它(根据您显示的代码),这是肯定的。 -
另外,如果你的“真实”代码还没有,你可以帮自己一个大忙,为所有(相关的)系统调用添加错误检查。正如所显示的代码所示,至少是
bind()、accept()、read()、write()和connect()。 -
我也有高级 Unix 编程,来自 stevens。