标签:udp
基于UDP(不是面向连接)的socket编程,分为客户端和服务器端。
客户端的流程如下:
(1)创建套接字(socket)
(2)和服务器端进行通信(sendto)
(3)关闭套接字
sendto函数:指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
返回值为整型,如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。
sockfd: 套接字
buf: 待发送数据的缓冲区
len: 缓冲区长度
flags:调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式:阻塞
addr:(可选)指针,指向目的套接字的地址
addr:lenaddr所指地址的长度
服务器端的流程如下:
(1)创建套接字(socket)
(2)将套接字绑定到一个本地地址和端口上(bind)
(3)用返回的套接字和客户端进行通信(recvfrom)
(4)返回,等待另一个客户请求。
(5)关闭套接字。
recvfrom函数:本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
sockfd:标识一个已连接套接口的描述字。
buf:接收数据缓冲区。
len:缓冲区长度。
flags:调用操作方式。
src_addr:(可选)指针,指向装有源地址的缓冲区。——输出型参数
addrlen:(可选)指针,指向from缓冲区长度值。——输入输出型参数。
返回值为整型,如果成功,则返回接收到的字节数,失败则返回SOCKET_ERROR。
//server端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
void Usage(const char* proc)
{
printf("%s [ip][port]\n");
}
int main(int argc,char* argv[])
{
if(argc!=3){
Usage(argv[0]);
return 1;
}
int sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0){
perror("socket");
return 2;
}
int _port=atoi(argv[2]);
char* _ip=argv[1];
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(_port);
local.sin_addr.s_addr=inet_addr(_ip);
if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){
perror("bind");
exit(1);
}
char buf[1024];
struct sockaddr_in remote;
socklen_t len=sizeof(remote);
while(1)
{
ssize_t _s=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&remote,&len);
if(_s>0)
{
buf[_s]=‘\0‘;
printf("client:[ip:%s][port:%d] %s",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port),buf);
}
else if(_s==0){
printf("client close");
break;
}
else
{
break;
}
}
close(sock);
return 0;
}
//client端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
void Usage(const char* proc)
{
printf("%s[ip][port]",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3){
Usage(argv[0]);
return 1;
}
int sock=socket(AF_INET,SOCK_DGRAM,0);
if(sock<0){
perror("socket");
return 2;
}
int _port=atoi(argv[2]);
char* _ip=argv[1];
struct sockaddr_in client;
client.sin_family=AF_INET;
client.sin_port=htons(_port);
client.sin_addr.s_addr=inet_addr(_ip);
char buf[1024];
while(1)
{
ssize_t _s=read(0,buf,sizeof(buf)-1);
if(_s>0){
buf[_s]=‘\0‘;
}
_s=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,sizeof(client));
}
return 0;
}运行截图:
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1775684
标签:udp
原文地址:http://10541556.blog.51cto.com/10531556/1775684