一、server端:
1. socket创建套接字
int sock = socket(AF_INET, SOCK_DGRAM, 0) //本地udp用AF_UNIX
2. bind绑定地址和端口
struct sockaddr_in svr_addr;
memset(&svr_addr, 0, sizeof(struct sockaddr_in));
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(9999);
if (bind(sock, (struct sockaddr *)&svr_addr, sizeof(struct sockaddr_in)) < 0)
{
printf("bind failed: %d\n", errno);
return -1;
}
3. 接收client端数据并做回应
while(1)
{
recvfrom();
sendto();
}
二、client端
1. socket创建套接字
2. sendto发送数据
3. recvfrom接收服务端回应
大概流程就是这样了。
在实际实践中,我遇到了一些很悲剧的问题:
1. bind无法绑定成功, errno错误代号为99
这个问题其实很简单,我是因为在一个while(1) 循环中,如果失败,就会继续下一次循环并重新绑定。简单的说,就是重复绑定。
2. client端的sendto无法成功,errno为101,查找相关文档,发现是找不到指定的目标。
这个就郁闷了。我弄了很久,检查了所有的函数和参数,就是找不到!!后来发现,是因为在设置server地址和端口时,将字符ip转换为unsigned long 型时,
用了一次htonl函数。是的,应该用,所以我没有想到会是这个有错误。后来问老大才知道,是因为用了才发生的错误,所以他的解决方法是:使用两次!!
这确实是我想不到的。
记录下这一次遇到的问题,以便以后可以看看。。