通过C中的套接字发送IP地址
Posted
技术标签:
【中文标题】通过C中的套接字发送IP地址【英文标题】:Sending IP address through socket in C 【发布时间】:2013-04-19 05:12:53 【问题描述】:我目前有一个工作客户端(用 C++ 编写)和一个工作服务器(用 C 编写)。我目前正在尝试弄清楚如何从服务器向客户端发送一条消息,上面写着“你好,(客户端 IP 地址)”,当他说“你好”时我想回复客户端一条消息我的选择。此外,当客户端发送“退出”时,我想断开客户端,但不关闭服务器。下面是我的代码。
while(true) // loop forever
client = accept(sock,(struct sockaddr*)&from,&fromlen); // accept connections
unsigned long ulAddr = from.sin_addr.s_addr;
char *client_ip;
client_ip = inet_ntoa(from.sin_addr);
cout << "Welcome, " << client_ip << endl; // usually prints hello %s
// cout << "client before thread:" << (int) client << endl;
// create our recv_cmds thread and pass client socket as a parameter
CreateThread(NULL, 0,receive_cmds,(LPVOID)client, 0, &thread);
WSACleanup();
更新的代码* 我当前的问题是它只打印Welcome %s
,而不是实际的 IPv4 地址。
【问题讨论】:
你的问题是......?char welcome[90] = "Welcome %s",inet_ntoa(addr_remote.sin_addr);
不起作用,我不确定如何发送客户端的 IP 地址。
您可能想阅读strcat
和/或sprintf()
手册页(如果使用C)和/或ostringstream
手册页(如果使用C++)...他们'将向您展示如何填充欢迎信息(或改为 ostringstream
)。
为什么要将地址发送到服务器 - 服务器在接收连接时应该从系统获取此信息 - 它甚至会更加健壮 - 如果客户端在 NAT 后面怎么办?
对于这个特定的项目,我们将在同一个网络上,只是一些朋友和我在制作我们自己的聊天程序。
【参考方案1】:
char welcome[90] = "欢迎 %s",inet_ntoa(addr_remote.sin_addr);
您不能在这样的声明中格式化字符串缓冲区。您需要改用sprintf()
或类似函数,例如:
char welcome[90];
sprintf(welcome, "Welcome %s", inet_ntoa(addr_remote.sin_addr));
或者使用std::string
代替:
std::string welcome = "Welcome " + std::string(inet_ntoa(addr_remote.sin_addr));
...
write(nsockfd , welcome.c_str() , welcome.length());
【讨论】:
以上是关于通过C中的套接字发送IP地址的主要内容,如果未能解决你的问题,请参考以下文章