s4服务器udp协议,使用UDP的ECHO服务器和客户端

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define RET_OK 0

#define RET_ERR -1

#define LISTEN_QUEUE_NUM 5

#define BUFFER_SIZE 256

#define ECHO_PORT 2029

int main(int agrc,char **argv)

{

int sockfd,opt=1;

uint32_t len;

struct sockaddr_in cliaddr;

uint8_t buffer[BUFFER_SIZE];

int ret=RET_OK;

if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)

{

perror("ERROR opening

socket");

return RET_ERR;

}

//SO_REUSEADDR允许重用本地址

if((ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)))<0)

{

perror("ERROR

setsockopt");

goto failed;

}

memset(&cliaddr,0,sizeof(cliaddr));

cliaddr.sin_family=AF_INET;

cliaddr.sin_addr.s_addr=INADDR_ANY;

cliaddr.sin_port=htons(ECHO_PORT);

if((ret=bind(sockfd,(struct

sockaddr*)&cliaddr,sizeof(cliaddr)))<0)

{

perror("ERROR on

binding");

goto failed;

}

do

{

len=sizeof(cliaddr);

if((ret=recvfrom(sockfd,buffer,sizeof(buffer),0,(struct

sockaddr*)&cliaddr,&len))>0)

{

printf("Recv

from %s\r\n",inet_ntoa(cliaddr.sin_addr));

ret=sendto(sockfd,buffer,ret,0,(struct

sockaddr*)&cliaddr,len);

}

}while(ret>=0);

failed:

close(sockfd);

return 0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define RET_OK 0

#define RET_ERR -1

#define LISTEN_QUEUE_NUM 5

#define BUFFER_SIZE 256

#define ECHO_PORT 2029

int main(int argc,char **argv)

{

int sockfd;

int ret=RET_OK;

struct sockaddr_in servaddr,recvaddr;

struct hostent *server;

char buffer[BUFFER_SIZE];

if(argc<2)

{

fprintf(stderr,"usage

&s hostname\n",argv[0]);

return RET_ERR;

}

if((server=gethostbyname(argv[1]))==NULL)

{

herror("gethostbyname.");

return RET_ERR;

}

if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)

{

herror("ERROR opening

socket");

return RET_ERR;

}

memset(&servaddr,0,sizeof(servaddr));//申请信息表空间

servaddr.sin_family=AF_INET;//设为IPv4

servaddr.sin_addr.s_addr=*(uint32_t

*)server->h_addr;//地址转换,32位大端字序

servaddr.sin_port=htons((uint16_t)ECHO_PORT);//设定端口,16位大端字序转换

while(1)

{

printf("Enter the message :

");

if(fgets(buffer,sizeof(buffer)-1,stdin)==NULL)break;

if((ret=sendto(sockfd,buffer,strlen(buffer),0,(struct

sockaddr*)&servaddr,sizeof(servaddr)))<0)

{

perror("ERROR

writing to socket");

break;

}

uint32_t

len=sizeof(recvaddr);

retry:

if((ret=recvfrom(sockfd,buffer,sizeof(buffer)-1,0,(struct

sockaddr*)&recvaddr,&len))<0)

{

perror("ERROR

reading from socket");

break;

}

if(servaddr.sin_family!=recvaddr.sin_family||servaddr.sin_addr.s_addr!=recvaddr.sin_addr.s_addr||servaddr.sin_port!=recvaddr.sin_port)

{

fprintf(stderr,"Received

%s echo\r\n",inet_ntoa(recvaddr.sin_addr));

goto

retry;

}

buffer[ret]=0;

printf("Server echo message:

%s\n",buffer);

}

close(sockfd);

return ret<0?RET_ERR:RET_OK;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值