首页  »   C++

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

网友分享于:2015-08-26  浏览:9次
关于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和端口,(就像你打电话给某人,你必须知道他给你的电话号码~)才能请求到服务器. 这也并不是说他们通信时的端口就必须一样

相关解决方案

最新解决方案