GO GO GO, Fire in the Hole!!!

Sunday, January 15, 2006

 

有关UDP的一点总结

在winsocket编程中,UDP类型的socket一样可以调用connect方法,将一个远端地址和本地地址进行一个逻辑上的绑定,以简化后续的sendto和recvfrom调用。但是,如果我们只调用bind,而不调用connect,同样可以在udp的socket上面调用recv方法:
sockaddr_in localaddr;
localaddr.sin_family=AF_INET;
localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
localaddr.sin_port=htons(9090);
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(s, (SOCKADDR*)&localaddr, sizeof(SOCKADDR));
char buf[255];
recv(s, buf, 255, 0);
这段代码可以收到所有成功发到本机的9090端口的udp数据,不过你无法得知收到的数据的来源地址。
如果在recv之前调用了connect,并传入一个远端地址,比如说127.0.0.1的9091端口,那么除了从这个地址发来的udp数据以外,recv调用不会收到其他的数据。
另外,也可以不调用bind,直接调用connect,winsocket不会返回错误,recv调用也会一直阻塞,但是不知道向哪个端口发数据才能收到;如果不调用bind也不调用connect,直接调用recv,winsocket将会返回SOCKET_ERROR,错误码是10022,“提供了一个无效的参数”。

Comments: Post a Comment





<< Home

Archives

October 2005   December 2005   January 2006   June 2009  

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]