Chinaunix首页 | 论坛 | 博客
  • 博客访问: 438759
  • 博文数量: 78
  • 博客积分: 2030
  • 博客等级: 大尉
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 15:25
文章分类

全部博文(78)

文章存档

2012年(1)

2011年(1)

2010年(4)

2009年(12)

2008年(60)

我的朋友

分类:

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中就是这个作用,
用它来检测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;

阅读(1059) | 评论(2) | 转发(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不应当是检测对端端口是否开放。