日期:2014-05-16  浏览次数:21033 次

recvfrom源IP地址地址和端口
基于UDP协议,客户端发送一个消息给服务器,服务器开一个线程,专门用来读取客户端发送的消息(recvfrom函数),按理说,recvfrom的第三个参数是客户端addr结构的指针,这里存放着客户端的IP和端口信息,但是我解析之后的数据是不对的,但是我用这个结构作为sendto的目的地址,对方可以收到,这是怎么回事?
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:%s\n", acReadBuff);
printf("IP:%s\n", (char *)inet_ntoa(stSockAddr.sin_addr));
printf("Port:%d\n", htons(stSockAddr.sin_port));
printf("nSinSize = %d\n", nSinSize);

sendto(s_nSockFd, "Serv Recv data", 15, 0, (struct sockaddr *)&stSockAddr, nSinSize);

sleep(1);
}
UDP recvfrom

------解决方案--------------------
有现成的sockaddr_in结构体你不用,为什么非要重复发明车轮再定义一个结构体?
------解决方案--------------------
把变量stSockAddr的类型改成系统自带的sockaddr_in类型试试,看了半天就发现这个错:
printf("Port:%d\n", htons(stSockAddr.sin_port));//应该是ntohs()