结构体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);
}