博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket 获取外部地址
阅读量:4167 次
发布时间:2019-05-26

本文共 759 字,大约阅读时间需要 2 分钟。

在linux内核中,一个socket有两个地址,一个本地地址,一个外部连接地址,。

如果使用udp协议,
在调用bind函数时,会把你要绑定的那个地址填到socket的本地地址那块地方.你要设成0.0.0.0它就给你填成0.0.0.0
在udp使用bind函数只是为了不用每此发送数据都填充地址这一参数传递过程而已.
只是在你发送数据时才会根据情况把实际的ip地址填到发送的数据的相应位置.
在内核接收到一个数据包时,会接收到一个外部地址,在你调用读函数时就把此地址读取走了.
如过使用tcp协议时,
在调用bind函数时,会把本地地址填到socket的本地地址那块地方.
在调用connect或则调用accecpt接收到连接时,回把外部地址那块填上.。在读写数据时,只读走数据,不会去读去地址的。
所以在tcp协议下,想通过recvfrom,sendto(一般用于无连接的套接字)去获取到外部连接的地址,是获取不到的,你得到的结果可能是0.0.0.0,可以再accpet之后获取到。

SOCKADDR_IN g_clientAddr;
SOCKET g_clientSock;
int iAddrSize = sizeof(g_clientAddr);memset((void*)&g_clientAddr, 0, sizeof(g_clientAddr));	//一定要初始化下地址变量,否则inet_ntoa得到结果会是204.204.204.204g_clientSock = accept(*serverSocket, (struct sockaddr *)&g_clientAddr, &iAddrSize);string strIP = inet_ntoa(g_clientAddr.sin_addr);

转载地址:http://gflxi.baihongyu.com/

你可能感兴趣的文章
sscanf中%s用法
查看>>
ps -aux中STAT列的标志位
查看>>
Linux fork() vfork()
查看>>
setsid的作用
查看>>
signal(SIGCHLD, SIG_IGN)
查看>>
vs2010如何引用相对路径
查看>>
Linux 下的KILL函数的用法
查看>>
return EXIT_SUCCESS
查看>>
linux下c程序调用reboot函数实现直接重启
查看>>
select实现延时的功能
查看>>
Linux进程间通信——使用消息队列
查看>>
Linux 消息队列命令
查看>>
atoi、stoi、strtoi区别
查看>>
正确使用memset
查看>>
fopen()、fwrite()、fread()函数使用说明与示例
查看>>
Linux 里有/lib和/usr/lib各个目录含义
查看>>
VS2010创建项目生成动态库举例
查看>>
利用word2010+直接发布到csdn
查看>>
在CSDN上发布视频blog
查看>>
linuxC语言按行存入txt文件,按行读取txt文件
查看>>