您的位置:首页 > 其它

基于UDP的服务器和客户端之间的通信

2017-05-25 17:49 736 查看
服务器:

1、创建套接字

sock=socket(AF_INET,SOCK_DGRAM,0)

2、绑定

0.0.0.0:8080 让操作系统自由分配一个有效的IP

3、收数据

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);


4、发数据

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);


代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
static void use(char* proc)
{
printf("%s [server_ip][server_port]\n",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
use(argv[0]);
return 1;
}
//创建套接字
int sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock<0)
{
perror("socket");
return 3;
}
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port =htons(atoi(argv[2]));
local.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(local);
//绑定
if(bind(sock,(struct sockaddr*)&local,len)<0)
{
perror("bind");
return 4;
}
char buf[1024];
struct sockaddr_in client;
socklen_t _len=sizeof(client);
while(1)
{
//收数据
ssize_t s=recvfrom(sock,buf,sizeof(buf)-1,0, (struct sockaddr*)&client,&_len );
if(s>0)
{
printf("Client say#%s",buf);
}
else
{
perror("recvfrom");
return 5;
}
//发数据
ssize_t _s = sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&client,len);
if(_s<0)
{
perror("sendto");
return 6;
}
}
close(sock);
return 0;
}


客户端:

1、创建套接字

sock=socket(AF_INET,SOCK_DGRAM,0)

2、发数据

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);


3、收数据

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);


代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
static void use(char* proc)
{
printf("%s [server_ip][server_port]\n",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
use(argv[0]);
return 1;
}
//创建套接字
int sock =socket(AF_INET,SOCK_DGRAM,0) ;
struct sockaddr_in peer;
peer.sin_family = AF_INET;
peer.sin_port = htons(atoi(argv[2]));
peer.sin_addr.s_addr = inet_addr(argv[1]);
char buf[1024];
while(1)
{
printf("please enter#");
fflush(stdout);
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s>0)
{
//发数据
ssize_t _s = sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&peer,sizeof(peer));
if(_s<0)
{
perror("sendto");
return 2;
}
}
//收数据
ssize_t r =recvfrom(sock,buf,sizeof(buf)-1,0,NULL,NULL);
if(r<0)
{
perror("recvfrom");
return 3;
}
else
{
printf("server echo#%s",buf);
}
}
close(sock);
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息