Socket客户端总是连接到本地主机
Socket Client always connects to localhost
我有一个问题,我的客户端似乎总是连接到本地主机(127.0.0.1),即使我传递它的另一个地址。考虑:$ ./client 139.130.4.5 80
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
error("Opening Socket");
}
if ( (server = gethostbyname(argv[1])) == NULL) {
fprintf(stderr,"ERROR, no such hostn");
close(sockfd);
exit(0);
}
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portnum);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) == -1){
error("Connect", sockfd);
}
即使argv[1]
为139.130.4.5,portnum
为80,也总是会导致与本地主机的连接
In memcpy()函数:
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
第一个参数是目的地,第二个参数是源,所以不用
memcpy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
你应该写
memcpy( &serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
// ^ as Adam pointed out, no (char*) here
您有memcpy(3)
的参数反向。应该是memcpy(dest, source, len)
:
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
同样,在调用memcpy()
和memset()
时不应该强制转换为char *
,因为它们接受void*
作为参数,任何指针类型都可以隐式地转换为void*
而不需要强制转换。强制类型转换只会使代码变得混乱,并可能隐藏潜在的错误(比如试图传入非指针类型)。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 如何强制 Thrift 仅接受来自本地主机的连接
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- Cesanta Mongoose - 连接到本地主机时出现问题
- Cassandra 驱动程序中每个主机的最大连接数
- 在为C 设置NetBean时,它显示了未连接的构建主机
- 通过套接字一致地丢失数据(但在使用本地主机连接时不会)
- 本地主机上的最大连接数
- c++winsock客户端无法使用主机IP的文本框进行连接
- QTcpSocket:使用bind()选择源接口,以便使用connectToHost()连接到远程主机:需要一个解决方法
- 如何只允许来自本地主机的TCP连接
- C++程序在执行时崩溃且没有错误消息 con = 驱动程序>连接(主机、用户、通行证);
- 彭博 API 连接问题 - <本地主机:8194> 连接失败
- 用C连接到主机
- Socket客户端总是连接到本地主机
- 检查Windows机器是否可以作为RDP连接中的主机
- 在本地主机套接字上是否需要任何类型的保持连接
- C/ c++ Posix tcp/ip网络客户端,只连接到本地主机
- 在连接(ping)之前验证IP地址(主机)是否存在
- 日志含义boost::asio连接本地主机失败