
size = sizeof(sockaddr);
newfd = accept(sockfd,(struct sockaddr)&new_add,&size); printf("%s\n",inet_ntoa(new_addsin_addr));//转换成字符IP
接收指定IP的数据包,其他IP都要过滤吧,那就用防火墙来搞吧
使用的是client段的获取方式,用client的可以指定IP,代码大概如下
public void SendMessage()
{
ASCII = EncodingASCII;
// 构造用于发送的 字节缓冲
Byte[] sendBytes = ASCIIGetBytes(SEND_MESSAGE);
// 构造用于接收的 字节缓冲
Byte[] recvBytes = new Byte[256];
// IP地址
IPAddress localAddr = IPAddressParse("1921681981");
// 接入点
IPEndPoint ephost = new IPEndPoint(localAddr, PORT);
// 第一个参数:AddressFamily = 指定 Socket 类的实例可以使用的寻址方案。
// Unspecified 未指定地址族。
// InterNetwork IP 版本 4 的地址。
// InterNetworkV6 IP 版本 6 的地址。
//
// 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型。
// Stream 一个套接字类型,支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
// 此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。
// 此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
//
// 第三个参数:ProtocolType = 指定 Socket 类支持的协议。
// Tcp 传输控制协议 (TCP)。
Socket s = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp);
try
{
// 尝试连接主机
sConnect(ephost);
//ConsoleWriteLine("向服务器发送到了:{0}", SEND_MESSAGE);
// 向主机发送数据
// sSend(sendBytes, sendBytesLength, SocketFlagsNone);
// 接收服务器的应答
Int32 bytes = sReceive(recvBytes, recvBytesLength, SocketFlagsNone);
StringBuilder buff = new StringBuilder();
// while (bytes > 0)
// {
// 将缓冲的字节数组,装换为字符串
// String str = ASCIIGetString(recvBytes, 0, bytes);
String str = "";
for (int i = 0; i < recvBytesLength; i++)
{
str = str + recvBytes[i];
}
int iCount = 0;
iCount = intParse(strSubstring(13, 6)) ;
// 加入字符串缓存
buffAppend(str);
// 再次接受,看看后面还有没有数据
//bytes = sReceive(recvBytes, recvBytesLength, SocketFlagsNone);
// }
textBox1Text = iCountToString();
}
catch (Exception ex)
{
MessageBoxShow("连接/发送/接收过程中,发生了错误!");
MessageBoxShow(exMessage);
//ConsoleWriteLine("连接/发送/接收过程中,发生了错误!");
//ConsoleWriteLine(exMessage);
//ConsoleWriteLine(exStackTrace);
}
finally
{
sClose();
}
}
IPAddress remote_ip = ((SystemNetIPEndPoint)workerSocketRemoteEndPoint)Address;//获取远程连接IP
暂时还没看出问题来,可以测试一下
1、判断getpeername的返回值,若有错误,把错误代码打印出来;
2、wsprintf函数是针对UNICODE字符的吧?为什么不用sprintf
3、你的备注里说因为网络传送是低位先传送,正确的应该是网络字节序和主机字节序的问题,在网络上使用网络字节序,是高位先存。主机字节序其实又包括大端和小端,而htons, htonl, inet_addr, inet_ntoa, inet_ntol这些函数就是用于实现主机字节序和网络字节序的转换的,这些函数内部会根据大端还是小端来决定如何将数值转换成网络字节序。
在服务器端利用一个socket开始侦听----也就是调用他的accept()之后,accept接收到请求会返回一个socket,创建一个socket引用就收这个socket,再看他的remoteendpoint属性就是了
通过计算机名称获得ip
SystemNetIPAddress[] addresses = SystemNetDnsGetHostAddresses ( ">
以上就是关于【VC++】socket小程序获取连接者的IP问题全部的内容,包括:【VC++】socket小程序获取连接者的IP问题、怎么用socket指定想要接收的IP发送的数据包、怎么用Socket.RemoteEndPoint 获取客户端IP和端口 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)