基于Linux下的UDP编程(2)

结构体sockaddr的长度为16字节,结构体sockaddr_in的长度为16字节。可以将参数my_addr的sin_addr设置为INADDR_ANY而不是某个确定的IP地址就可以绑定到任何网络接口。对于只有一IP地址的计算机,INADDR_ANY对应的就是它的IP地址;对于多宿主主机(拥有多个网卡),INADDR_ANY表示本服务器程序将处理来自所有网络接口上相应端口的连接请求

5>  返回值:

函数成功后返回0,当有错误发生时则返回-1,错误代码存入errno中。

6>举例:调用socket函数创建一个UDP套接字

struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/

memset(&serv_addr,0,sizeof(struct sockaddr_in));

addr_serv.sin_family = AF_INET;/*协议族*/

addr_serv.sin_port = htons(SERV_PORT);/*本地端口号*/

addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); /*任意本地地址*/
/*套接字绑定*/

if(bind(sock_fd,(struct sockaddr *)&addr_serv),sizeof(structsockaddr_in)) <0)

{

perror(“bind”);

exit(1);

}

3.close

1>函数原型:

int  close(intfd);

2>函数功能:

函数close用来关闭一个套接字描述符。

3>函数形参:

?  参数fd为一个套接字描述符。

4>返回值:

执行成功返回0,出错则返回-1.错误代码存入errno中。

说明:

以上三个函数中,前两个要包含头文件

#include<sys/types.h>

#include<sys/socket.h>

后一个包含:

#include<unistd.h>

4.sendto

1>函数原型:

#include<sys/types.h>

#include<sys/socket.h>

ssize_t sendo(ints,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_ttolen);

2>函数功能:

向目标主机发送消息

3>函数形参:

?  s:套接字描述符。

?  *msg:发送缓冲区

?  len:待发送数据的长度

?  flags:控制选项,一般设置为0或取下面的值

(1)MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(eg:SOCK_STREAM).

(2)MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。

?  to:用于指定目的地址

?  tolen:目的地址的长度。

4>函数返回值:

执行成功后返回实际发送数据的字节数,出错返回-1,错误代码存入errno中。

5>函数举例:

char  send_buf[BUFFERSIZE];

struct sockaddr_in  addr_client;

memset(&addr_client,0,sizeof(struct sockaddr_in));

addr_client.sin_family = AF_INET;

addr_client.sin_port = htons(DEST_PORT);

if(inet_aton(“172.17.242.131”,&addr_client.sin_addr)<0){

perror(“inet_aton”);

exit(1);

}

if(sendto(sock_fd,send_buf,len,0,(strut sockaddr*)&addr_client,sizeof(struct sockaddr_in)) <0){

perror(“sendto”);

exit(1);

}

5.recvfrom

1>函数原型:

#include<sys/types.h>

#include<sys/socket.h>

ssize_t recvfrom(int s,void *buf,size_t len,intflags,struct sockaddr *from,socklen_t *fromlen);

2>函数功能:接收数据

3>函数形参:

?  int s:套接字描述符

?  buf:指向接收缓冲区,接收到的数据将放在这个指针所指向的内存空间。

?  len:指定了缓冲区的大小。

?  flags:控制选项,一般设置为0或取以下值

(1)MSG_OOB:请求接收带外数据

(2)MSG_PEEK:只查看数据而不读出

(3)MSG_WAITALL:只在接收缓冲区时才返回。

?  *from:保存了接收数据报的源地址。

?  *fromlen:参数fromlen在调用recvfrom前为参数from的长度,调用recvfrom后将保存from的实际大小。

4>函数返回值:

执行成功后返回实际接收到数据的字节数,出错时则返回-1,错误代码存入errno中。

5>函数实例:

char recv_buf[BUFFERSIZE];

struct sockaddr_in addr_client;

int  src_len;

src_len = sizeof(struct sockaddr_in);

int src_len;

src_len = sizeof(struct sockaddr_in);

if(recvfrom(sock_fd,recv_buf,sizeof(recv_buf),0,(structsockaddr *)&src_addr,&src_len)<0){

perror(“again_recvfrom”);

exit(1);

}

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzyww.html