1、udp client
1.1 udp_client.h
#ifndef UDPDEMO_UDP_CLIENT_H
#define UDPDEMO_UDP_CLIENT_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
class UdpClient
{
public:
UdpClient(){};
static void hand(int val);
void startClient(int argc, char* argv[]);
private:
static int clientSocket;
};
#endif //UDPDEMO_UDP_CLIENT_H
1.2 udp_client.cpp
#include "udp_client.h"
int UdpClient::clientSocket = -1;
void UdpClient::hand(int val)
{
//5 close server
close(clientSocket);
printf("bye! \n");
exit(0);
}
void UdpClient::startClient(int argc, char **argv)
{
if(argc != 4) printf("please write ip adress and port!\n"), exit(0);
printf("ip= %s port = %d\n", argv[1], atoi(argv[2]));
signal(SIGINT, hand);
//1 create socket 参数 1:协议类型(版本) 2,通信媒介 3,保护方式
clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == clientSocket) printf("create socket error:%m\n"), exit(-1);
printf("create socket sucess !\n");
//2 create server agreement adresses
struct sockaddr_in cAddr = {0};
cAddr.sin_family = AF_INET;
cAddr.sin_addr.s_addr = inet_addr(argv[1]);
cAddr.sin_port = htons(atoi(argv[2]));
//3 communication
char buff[256];
char temp[256];
int r;
socklen_t len = sizeof(cAddr);
while (1)
{
// send message
printf("what do you want to send: ");
scanf("%s",buff);
sendto(clientSocket, buff, strlen(buff),0, (struct sockaddr*)&cAddr,sizeof cAddr);
//recive message
r = recvfrom(clientSocket, temp, 255, 0, (struct sockaddr*)&cAddr, &len);
if(r > 0)
{
temp[r] = 0;
printf("server send message>> %s\n", temp);
}
}
}
2.udp server
2.1 udp_server.h
#ifndef UDPDEMO_UDP_SERVER_H
#define UDPDEMO_UDP_SERVER_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
class UdpServer
{
public:
UdpServer(){};
static void hand(int val);
void startServer(int argc, char* argv[]);
private:
static int serverSocket;
};
#endif //UDPDEMO_UDP_SERVER_H
2.2 udp_server.cpp
#include "udp_server.h"
int UdpServer::serverSocket = -1;
void UdpServer::hand(int val)
{
//5 close server
close(serverSocket);
printf("bye! \n");
exit(0);
}
void UdpServer::startServer(int argc, char* argv[])
{
if(argc != 4) printf("please write ip adress and port!\n"), exit(0);
printf("ip= %s port = %d\n", argv[1], atoi(argv[2]));
signal(SIGINT, hand);
//1 create socket 参数 1:协议类型(版本) 2,通信媒介 3,保护方式
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == serverSocket) printf("create socket error:%m\n"), exit(-1);
printf("create socket sucess !\n");
//2 create server agreement adresses
struct sockaddr_in sAddr = {0};
sAddr.sin_family = AF_INET;
sAddr.sin_addr.s_addr = inet_addr(argv[1]);
sAddr.sin_port = htons(atoi(argv[2]));
//3 binding
int r = bind(serverSocket, (struct sockaddr*)&sAddr, sizeof sAddr);
if(-1 == r) printf("binding is faile :%m ]\n"), close(serverSocket), exit(-2);
printf("binding is sucess! \n");
//4 communication
char buff[256];
struct sockaddr_in cAddr = {0};
socklen_t len = sizeof(cAddr);
while (1)
{
//如果还需要向客户端发送东西用recvfrom
//upd精髓, 向一个协议地址簇发东西
r = recvfrom(serverSocket, buff, 255, 0, (struct sockaddr*)&cAddr,&len);
if(r > 0)
{
buff[r] = 0; //添加字符串结束符号
printf(">>%s\n", buff);
}
printf("what do you want to say to client: ");
memset(buff, 256, 0);
scanf("%s", buff);
sendto(serverSocket, buff, strlen(buff),0, (struct sockaddr*)&cAddr,sizeof cAddr);
}
}
3.main
#include "udp_client.h"
#include "udp_server.h"
int main(int argc, char *argv[])
{
printf("%d\n", argc);
if (argc == 4)
{
printf("%s\n", argv[3]);
if (0 == atoi(argv[3])) // server
{
UdpServer server;
server.startServer(argc, argv);
}
else if (1 == atoi(argv[3])) // client
{
UdpClient client;
client.startClient(argc, argv);
}
}
else
std::cout << "please write right param!" << std::endl;
}