- 论坛徽章:
- 1
|
再问UDP(蓝色键盘一定要进来)
原帖由 "一颗流星" 发表:
蓝色键盘,记得上次你跟我说过,在udp中,发送方不一定要bind,但是被动接收方一定要bind,其中的原因你说得非常详细,让我明白了很多,也解决了当时的问题。
不过,可能是因为我并没有完全理解udp模式,我在想..........
呵呵,其实关键是理解sendto和recvfrom最后两个参数的含义。为了理解方便,sendto最后两个参数类似于connect的最后两个参数,recvfrom的最后两个参数类似于accept的最后两个参数。
下面是recvfrom的原型:
ssize_t recvfrom(
int s,
void *buf,
size_t len,
int flags,
struct sockaddr *from,
socklen_t *fromlen
);
当recvfrom调用成功,例如你的服务器调用该函数,那么结构struct sockaddr *from将由客户的IP和端口号来装填,这个动作由协议实现的。既然对方的IP和PORT已经存在于结构from中了,那么使用sendto的时候,做后两个参数直接引用该指针就可以了。
例如下面的一段代码,recvfrom收到数据后,返回信息给发送者。
- 。。。。
- struct sockaddr_in serv,client;
- 。。。。/*局部变量定义*/
- sockfd=socket(AF_INET,SOCK_DGRAM,0);
- 。。。。/*填充serv结构,bind等*/
- /*接受数据*/
- recvlen = recvfrom(sockfd,(char *)&recvbuf,len,0,(struct sockaddr *)&client,&clientlen );
- 。。。。/*接受数据处理*/
- /*返回给对方*/
- sendlen=sendto(sockfd,(char *)&sendbuf,len,0,(struct sockaddr *)&client,sizeof(client));
- /*其他处理*/
复制代码 |
|