可以使用这个实现。
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort
);
可以使用 inet_addr得到IP地址字符串对应的int。
另一个实现中的数据结构:
struct sockaddr {
ushort sa_family;
char sa_data[14];
};
实际上等同于如下架构,可以强制转换使用的。
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
其中sin_addr是一个union
typedef struct in_addr {
union {
struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { USHORT s_w1,s_w2; } S_un_w;
ULONG S_addr;
} S_un;
} IN_ADDR, PIN_ADDR, FAR LPIN_ADDR;
我们一般用S_addr,这个就是IP地址,可以使用inet_ntoa得到对应字符串
我在原来的问题里也回答你了,记得采纳哦
ysdoc的回答不对的,因为GetSockName的值是输出,不是输入,所以不需要用recvfrom去获取。
在对话框 上 拖放一个List Control 控件 ID为 ID_LIST1
更改属性 样式为:Report(报表) 模式//切记这里
为ID_LIST1添加控件变量:CListCtrl m_list;
在适当位置(如对话框的初始化函数里)添加初始化代码:
m_listSetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//(1)
m_listInsertColumn(1,"用户名",LVCFMT_CENTER,100);//(2)
m_listInsertColumn(1,"工作组",LVCFMT_CENTER,150);//(3)
m_listInsertColumn(2,"主机名",LVCFMT_CENTER,100);//
m_listInsertColumn(3,"IP地址",LVCFMT_CENTER,100);//
解释:(1)句的作用是:使列表整栏选择。
(2)句的作用是添加一个列,LVCFMT_CENTER意思是居中对齐,100是宽度
你可能问 为什么 第一个参数 和 (3)句都是1呢 ,(2)句应该是0啊?是的,应该是0,但是使用0后LVCFMT_CENTER就不起作用了,不信你看看,说明的是 如果没有0列,那么1列补上 但是 如果是 两个2,那么第二个2就真的第3列,第一个2就成了第四列,你自己做个实验就知道了。
然后在适当位置 如得到信息后
使用:
m_listInsertItem(0,"张三");// (6)注意这个函数
m_listSetItemText(0,1,"四号工作组");//(7)
m_listSetItemText(0,2,"lenovo0001");//(8)
m_listSetItemText(0,3,"1921681055");
解释:(6)句中第一个参数 为0表示 添加到 第一条记录,1代表第二条记录 类推,
(7)句 中的第一个参数是 设置 文本,第一个参数 是与之对应的 记录行
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。你的串号我已经记下,采纳后我会帮你制作
listen()监听
accept()接收链接请求
访问客户端地址信息结构体client
clientsin_addr中储存客户端的ip地址
再转换格式就行了
1)通过代码手动添加: addrinfo aiList = NULL; char aHost[MAX_MFC中的IP地址控件是由CIPAddressCtrl类封装的。你可以研究一下他的成员函数。
以上就是关于MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用全部的内容,包括:MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用、VC中IP地址控件的使用、MFC关于读取客户端IP等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)