当前位置: 技术问答>linux和unix
recvfrom源IP地址地址和端口
来源: 互联网 发布时间:2017-05-15
本文导语: 基于UDP协议,客户端发送一个消息给服务器,服务器开一个线程,专门用来读取客户端发送的消息(recvfrom函数),按理说,recvfrom的第三个参数是客户端addr结构的指针,这里存放着客户端的IP和端口信息,但是我解析之...
基于UDP协议,客户端发送一个消息给服务器,服务器开一个线程,专门用来读取客户端发送的消息(recvfrom函数),按理说,recvfrom的第三个参数是客户端addr结构的指针,这里存放着客户端的IP和端口信息,但是我解析之后的数据是不对的,但是我用这个结构作为sendto的目的地址,对方可以收到,这是怎么回事?
addr结构如下
线程处理函数如下:
addr结构如下
typedef struct tagIn_Addr
{
unsigned long in_addr;
}IN_ADDR_T;
typedef struct tagSockaddr
{
unsigned short int sin_family;
unsigned short int sin_port;
IN_ADDR_T sin_addr;
unsigned char sin_zero[8];
}SOCK_ADDR_T;
线程处理函数如下:
SOCK_ADDR_T stSockAddr = {0};
char acReadBuff[256] = {0};
int nSinSize = sizeof(SOCK_ADDR_T);
while(1)
{
memset(&stSockAddr, 0x00, nSinSize);
recvfrom(s_nSockFd, acReadBuff, 256, 0, (struct sockaddr *)&stSockAddr, &nSinSize); //s_nSockFd:socket之前创建号的
printf("Get a new message:%sn", acReadBuff);
printf("IP:%sn", (char *)inet_ntoa(stSockAddr.sin_addr));
printf("Port:%dn", htons(stSockAddr.sin_port));
printf("nSinSize = %dn", nSinSize);
sendto(s_nSockFd, "Serv Recv data", 15, 0, (struct sockaddr *)&stSockAddr, nSinSize);
sleep(1);
}
|
有现成的sockaddr_in结构体你不用,为什么非要重复发明车轮再定义一个结构体?
|
把变量stSockAddr的类型改成系统自带的sockaddr_in类型试试,看了半天就发现这个错:
printf("Port:%dn", htons(stSockAddr.sin_port));//应该是ntohs()