首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

socket通信的端口相关有关问题,请问

2013-01-11 
socket通信的端口相关问题,请教?本帖最后由 VisualEleven 于 2013-01-04 09:59:53 编辑代码如下:struct so

socket通信的端口相关问题,请教?
本帖最后由 VisualEleven 于 2013-01-04 09:59:53 编辑 代码如下:


struct sockaddr FAR  sAddrConnect;//声明结构体变量
int addrLength;

addrLength=sizeof(struct sockaddr);

// Accept an incoming connection
sTemp = accept(wParam, &sAddrConnect, &addrLength);
struct sockaddr_in sAddrTemp;
memcpy(&sAddrTemp, &sAddrConnect, addrLength);

port = DWORD(ntohs(sAddrTemp.sin_port));

if(!stricmp(ip, m_pNetPara[i]->GetRemoteIP()) && port == m_pNetPara[i]->GetRemotePort() && m_bConnectedFlag[i]==FALSE)

{
……
}
其中相关结构体如:


struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
};


struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

问题出在这:
if() 里的第二个条件 port == m_pNetPara[i]->GetRemotePort()总不相等,右边的 m_pNetPara[i]->GetRemotePort()是6000是正确的(配置文件xml中预配置的端口就是6000),但是左边的port

断点测试在:memcpy(&sAddrTemp, &sAddrConnect, addrLength);中sin_port=28204 //注:第二次测试值就发生变化如42284

经过网络字节转换成主机字节函数port = DWORD(ntohs(sAddrTemp.sin_port));转换后为:11374

这时在判断语句中 port == m_pNetPara[i]->GetRemotePort() 等价于11374==6000肯定不等



请问这是什么情况? socket 端口
[解决办法]
从你的描述看m_pNetPara[i]->GetRemotePort() 是服务器端口,而accept返回的是客户的端口,它们两个通常是不会相等的。拿这的socket例子学习一下:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
ACCEPT返回的是客户端连接本服务程序的网络信息,不是本服务程序使用的端口,客户端连接服务程序的指定端口,但客户端的端口不一定是服务程序的端口
[解决办法]
最好断点缓冲区,首先判断接收是否正确,排除粘包之类的问题。
之后,由于你GetRemotePort()是封装的,我们看不到你的实现,是否存错位要自己好好看看了。
[解决办法]
port == m_pNetPara[i]->GetRemotePort() 
你的m_pNetPara数组是什么类型的?你的GetRemotePort()又是怎么实现的?getpeername() ??

热点排行