sock编程,希望系统指定端口,bind时sin_port为0,bind成功并不能返回系统分配的端口,须使用getsockname获取
int testfd = socket(AF_INET, SOCK_DGRAM, 0);
if(testfd==-1){
printf("m socket error, %d, %s\n", errno, strerror(errno));
return -1;
}
struct sockaddr_in adr_srvr_test;
adr_srvr_test.sin_family = AF_INET;
adr_srvr_test.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr(Ip.c_str()) htonl(INADDR_ANY) inet_addr("192.168.3.11")
adr_srvr_test.sin_port = 0;
int len_srvr = sizeof(adr_srvr_test);
if(bind(testfd, (struct sockaddr *)&adr_srvr_test, len_srvr)){
printf("m socket bind, %d, %s\n", errno, strerror(errno));
close(testfd);
testfd = -1;
return -1;
}
printf("------------------ %d\n", adr_srvr_test.sin_port);
struct sockaddr_in tempsintests;
memset(&tempsintests, 0, sizeof(tempsintests));
#if (defined(WIN32) || defined(WIN64))
int sizetest = sizeof(tempsintests);
#else
socklen_t sizetest = sizeof(tempsintests);
#endif
if (getsockname(testfd, (struct sockaddr *)&tempsintests, &sizetest) == -1)
{
close(onvifmcastfd);
onvifmcastfd=-1;
}
else
{
//string m_LocalIp = inet_ntoa(tempsintests.sin_addr);
//int m_LocalPort = tempsintests.sin_port;
}
string m_LocalIp = inet_ntoa(tempsintests.sin_addr);
printf("------------------%s: %d\n", m_LocalIp.c_str(), tempsintests.sin_port);