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() ??