分类:
2008-10-28 22:37:13
标准的udp客户端开了套接口后,一般使用sendto和recvfrom函数来发数据,最近看到ntpclient的代码里面是使用send函数直接法的,就分析了一下,原来udp发送数据有两种方法供大家选用的,顺便把udp的connect用法也就解释清楚了。
方法一:
socket----->sendto()或recvfrom()
方法二:
socket----->connect()----->send()或recv()法
首先从这里看出udp中也是可以使用connect的,但是这两种方法到底有什么区别呢?首先把这四个发送函数的定义列出来:
int send(int s, const void *msg, size_t len, int flags);
int sendto(int s, const void *msg, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen);
int recv(int s, void *buf, size_t len, int flags);
int recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
从他们的定义可以看出,sendto和recvfrom在收发时指定地址,而send和recv则没有,那么他们的地址是在那里指定的呢,答案就在于connect.
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t
addrlen);
在udp编程中,如果你只往一个地址发送,那么你可以使用send和recv,在使用它们之前用connect把它们的目的地址指定一下就可以了。connect函数在udp中就是这个作用,
下面是ntpclient中的代码
struct sockaddr_in sa_dest;
bzero((char *) sa_dest, sizeof(*sa_dest));
sa_dest->sin_family=AF_INET;
if(StuffNetAddr(&(sa_dest->sin_addr),host))
return 1;
sa_dest->sin_port=htons(port);
if (connect(usd,(struct sockaddr *)&sa_dest,sizeof(sa_dest))==-1)
{perror("connect");return 1;}
return 0;
chinaunix网友2010-04-02 13:05:48
LZ说的是正确的. 当不是用connect时, socket就不能检测到所谓的异步错误. 据圣经中记载, 这个异步错误是这样描述的, send() 到一个未开启的端口, 服务器会返回ICMP回来, 但是这个时候呢, send() 已经返回了, 所以这个错误和send() 是异步的, 怎么接收呢? 就得需要做过connect的socket
chinaunix网友2009-09-29 10:15:35
to: 楼主, 那为什么编写一个udp connect函数 去连接一个未开放ip和port 也返回成功? connect不应当是检测对端端口是否开放。