首先我们需要一个 struct.h
#ifndef STRUCT_H
#define STRUCT_H
typedef struct _UDP_MSG {
int add1;
int add2;
int sum;
char str1[128];
char str2[128];
char cat[256];
} UDP_MSG;
#endif /* STRUCT_H */
然后是服务端的
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include "struct.h"
#define MAX_LINE 1024
#define SERV_PORT 8080
int udp_serv();
int main() {
return udp_serv();
}
int udp_serv() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_PORT);
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
return -1;
}
while (1) {
struct sockaddr_in cli_addr;
memset(&cli_addr, 0, sizeof(cli_addr));
UDP_MSG msg;
memset(&msg, 0, sizeof(msg));
socklen_t cli_addr_len = sizeof(cli_addr);
recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, &cli_addr_len);
msg.sum = msg.add1 + msg.add2;
strcpy(msg.cat, msg.str1);
strcat(msg.cat, msg.str2);
printf("msg.add1 is: %d\n", msg.add1);
printf("msg.add2 is: %d\n", msg.add2);
printf("msg.sum is: %d\n", msg.sum);
printf("msg.str1 is: %s\n", msg.str1);
printf("msg.str2 is: %s\n", msg.str2);
printf("msg.cat is: %s\n", msg.cat);
sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr*)&cli_addr, cli_addr_len);
}
return 0;
}
然后是客户端的
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "struct.h"
#define MAX_LINE 1024
#define SERV_PORT 8080
int udp_cli(const char* serv_ip);
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: %s serv_ip\n", argv[0]);
return 1;
}
return udp_cli(argv[1]);
}
int udp_cli(const char* serv_ip) {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
if (inet_pton(AF_INET, serv_ip, &serv_addr.sin_addr) <= 0) {
perror("inet_pton");
return -1;
}
while (1) {
UDP_MSG msg;
memset(&msg, 0, sizeof(msg));
msg.add1 = 1;
msg.add2 = 2;
sprintf(msg.str1, "hello ");
sprintf(msg.str2, "world");
if (sendto(sockfd, &msg, sizeof(msg), 0,
(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("write");
return -1;
}
socklen_t serv_addr_len = sizeof(serv_addr);
if (recvfrom(sockfd, &msg, sizeof(msg), 0,
(struct sockaddr*)&serv_addr, &serv_addr_len) == -1) {
perror("read");
return -1;
}
printf("msg.add1 is: %d\n", msg.add1);
printf("msg.add2 is: %d\n", msg.add2);
printf("msg.sum is: %d\n", msg.sum);
printf("msg.str1 is: %s\n", msg.str1);
printf("msg.str2 is: %s\n", msg.str2);
printf("msg.cat is: %s\n", msg.cat);
break;
}
return 0;
}
客户端另外一种,像这样的写法也行。。
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include "struct.h"
#define MAX_LINE 1024
#define SERV_PORT 8080
int udp_cli(const char* serv_ip);
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: %s serv_ip\n", argv[0]);
return 1;
}
return udp_cli(argv[1]);
}
int udp_cli(const char* serv_ip) {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
if (inet_pton(AF_INET, serv_ip, &serv_addr.sin_addr) <= 0) {
perror("inet_pton");
return -1;
}
if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
return -1;
}
while (1) {
UDP_MSG msg;
memset(&msg, 0, sizeof(msg));
msg.add1 = 1;
msg.add2 = 2;
sprintf(msg.str1, "hello ");
sprintf(msg.str2, "world");
if (write(sockfd, &msg, sizeof(msg)) == -1) {
perror("write");
return -1;
}
if (read(sockfd, &msg, sizeof(msg)) == -1) {
perror("read");
return -1;
}
printf("msg.add1 is: %d\n", msg.add1);
printf("msg.add2 is: %d\n", msg.add2);
printf("msg.sum is: %d\n", msg.sum);
printf("msg.str1 is: %s\n", msg.str1);
printf("msg.str2 is: %s\n", msg.str2);
printf("msg.cat is: %s\n", msg.cat);
break;
}
return 0;
}
然后编译
g++ -Wall -g serv.cpp -o serv.exe g++ -Wall -g cli.cpp -o cli.exe
就可以运行了
补充来源:http://www.chinaitpower.com/A200508/2005-08-02/182672.html