读书人

关于socket 网络地址端口号有有关问题

发布时间: 2013-04-21 21:18:07 作者: rapoo

关于socket 网络地址端口号有问题
本帖最后由 YuanHe_ 于 2013-04-12 11:59:57 编辑 服务器端代码


SOCKADDR_IN my_addr;
WORD SPort = 6666;
char SIP[16] = "127.0.0.1";
int slen = sizeof(sockaddr);
memset((void *)&my_addr, 0, slen );
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SPort);
my_addr.sin_addr.S_un.S_addr = inet_addr(SIP);
bind(serSock,(LPSOCKADDR)&my_addr,slen);
listen(serSock, 5);
accSock = accept(serSock,(sockaddr *)&my_addr,&alen) ;
in_addr conip;
conip.S_un.S_addr = my_addr.sin_addr.S_un.S_addr;
cout<<"*********************************************************\n";
cout<<"第"<<count<<" 个新连接 ip地址:"<<inet_ntoa(conip);
cout<<" 端口号:"<<(int)ntohs( my_addr.sin_port)<<endl;

客户端部分代码

Cs = socket(AF_INET,SOCK_STREAM,0);
SA.sin_family = AF_INET;
SA.sin_port = htons(SPort);
SA.sin_addr.S_un.S_addr = inet_addr(SIP);
connect(Cs,(struct sockaddr *) &SA , sizeof(SA));
in_addr conip;
conip.S_un.S_addr = my_addr.sin_addr.S_un.S_addr;
cout<<"*********************************************************\n";
cout<<"ip地址:"<<inet_ntoa(conip);
cout<<" 端口号:"<<(int)ntohs( my_addr.sin_port)<<endl;

服务器显示的是
第1 个新连接 ip地址:127.0.0.1 端口号:6847
客户端显示的是
ip地址:127.0.0.1 端口号:6666
为什么服务器端口号不是6666,是不是服务器的监听套接字占用了6666端口,响应套接字只能系统重新分配新端口号了? socket C 服务器
[解决办法]
首先
SOCKET accept(
SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen);
accept函数返回后,addr结构中会包含发出请求连接的那个 *客户机* 的IPv4地址信息;

而在你那客户端程序中设置的SA
SA.sin_family = AF_INET;
SA.sin_port = htons(SPort);
SA.sin_addr.S_un.S_addr = inet_addr(SIP);
是客户端所以请求的 *服务器端* 的IPv4的信息;并不是你客户端的IPv4信息;

两个程序中的端口号之所以要相同,那是因为,客户机必须知道 服务器的ip和端口,(就像你打电话给某人,你必须知道他给你的电话号码~)才能请求到服务器. 这也并不是说他们通信时的端口就必须一样

读书人网 >C++

热点推荐