sendto函数:

int sendto(int s,void *msg,int len,unsigned int flags,struct sockaddr *to,int tolen);

在参数列表中 ,s为已建立的额socket,在使用UDP协议时,不需要进行计算机的连接的操作,msg是需要发送的字符串,len为发送的字符串的长度,。参数flags一般为0,其他可能值数值如下:

  MSG_OOB:传送的数据已out-of-band送出。

  MSG_DONTROUTE:取消路由查询。

  MSG_DONTWAIT:设置为不可阻断传输。

  MSG_NOSIGNAL:此传输不被SIGPIPE信号中断。

参数sockaddr是一个套接字的结构体:

  struct socketaddr_in

{

  unsigned short int sin_family;//制定通讯地址的类型,如果是TCP/IP通信,则该值为AF_INET

  uint16_t sin_port;//套接字使用的端口号

  struct in_addr sin_addr;//需要访问的IP地址

  struct char sin_zero[8];//未使用的字段,填充为0

};

in_addr 为一个结构体struct in_addr

{

  uint32_t s_addr;

};tolen是sockaddr结构体的长度。

函数recvfrom可以从一个socket中接收其他主机发送来的信息。这个函数的使用方法如下所示。

int recvfrom(int s,void *buf,int len,unsigned int flags,sockaddr * from,int * fromlen)

 

这个程序的主要内容是建立一个套接字,然后从键盘读取一个字符串,用sendto函数将这个字符串发送到服务器,然后接受服务器发送回的的信息,实际编程中客户机与服务器在同一台计算机上,用127.0.0.1这个ip地址:

  客户端程序为

#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<strings.h>
#define REMOTEPORT 4567
#define REMOTEIP "127.0.0.1"
int main()
{
int s,len;
struct sockaddr_in addr;
int addr_len;
char msg[256];
int i=0;
if((s=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("socket:");
exit(1);
}
else
{
printf("scoket created.\n");
printf("socket id:%d\n",s);
printf("remote id%s\n",REMOTEIP);
printf("remote port is %d\n",REMOTEPORT);

}
len=sizeof(struct sockaddr_in);
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(REMOTEPORT);
addr.sin_addr.s_addr=inet_addr(REMOTEIP);
while(1)
{
bzero(msg,sizeof(msg));
addr_len=sizeof(struct sockaddr_in);
len=read(STDIN_FILENO,msg,sizeof(msg));
sendto(s,msg,len,0,(struct sockaddr*)&addr,addr_len);
printf("\nInput message :%s\n",msg);
len=recvfrom(s,msg,sizeof(msg),0,(struct sockaddr*)&addr,&addr_len);
printf("%d:",i);
i++;
printf("Received message:%s\n",msg);
}
return 0;
}

下边是服务器程序

#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<strings.h>
#define LOCALPORT 4567
int main()
{
int s,len;
struct sockaddr_in addr,client_addr;
int addr_len;
char msg[256];
int i=0;
if((s=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("socket:");
exit(1);
}
else
{
printf("scoket created.\n");
printf("socket id:%d\n",s);
}
len=sizeof(struct sockaddr_in);
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(LOCALPORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(LOCALPORT);
if(bind(s,(struct sockaddr*)&addr,sizeof(addr))<0)
{
perror("connect:");
exit(1);
}
else
{
printf("bind ok.\n");
printf("local port:%d\n",LOCALPORT);
}
while(1)
{
bzero(msg,sizeof(msg));
addr_len=sizeof(struct sockaddr_in);
len=recvfrom(s,msg,sizeof(msg),0,(struct sockaddr*)&client_addr,&addr_len);
printf("%d:",i);
i++;
printf("messsage from :%s\n",inet_ntoa(addr.sin_addr));
printf("message length:%d\n",len);
printf("message :%s\n\n",msg);
sendto(s,msg,len,0,(struct sockaddr*)&client_addr,addr_len);
}
return 0;
}