linux下的udp套接字实现的回射服务器,也就是客户发送一段,服务器把这段返回给客户。
客户端
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERV_PORT 5566
#define MAX_MESG_SIZE 1024
using namespace std;
int main()
{
int sockfd;
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
inet_aton("127.0.0.1", &servaddr.sin_addr);
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket error!\n");
return -1;
}
char buf[MAX_MESG_SIZE];
int n;
while(fgets(buf, MAX_MESG_SIZE, stdin) != NULL)
{
if((sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr))) < 0)
{
printf("sendto error\n");
return -1;
}
n = recvfrom(sockfd, buf, MAX_MESG_SIZE, 0, NULL, NULL);
buf[n] = 0;
fputs(buf, stdout);
}
return 0;
}
服务端:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERV_PORT 5566
#define MAX_MESG_SIZE 1024
using namespace std;
void my_echo(int sockfd)
{
struct sockaddr_in clientaddr;
socklen_t clientlen = sizeof(clientaddr);
int n;
char mesg[MAX_MESG_SIZE];
while(1)
{
n = recvfrom(sockfd, mesg, MAX_MESG_SIZE, 0, (struct sockaddr *)&clientaddr, &clientlen);
sendto(sockfd, mesg, n, 0, (struct sockaddr *)&clientaddr, clientlen);
}
}
int main()
{
int sockfd;
struct sockaddr_in servaddr;
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket error!\n");
return -1;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
if((bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) < 0)
{
printf("bind error!\n");
return -1;
}
my_echo(sockfd);
return 0;
}