2.1 基于UDP的网络编程

2.2.1 服务端实现
- 使用socket函数,创建一个socket
- 使用bind()函数,绑定ip地址、端口等信息到socket上
- 使用recvfrom()函数,循环接收数据
- 关闭网络
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 3212
#define MAX_SIZE 512
int main(int argc, char *argv[])
{
int sockfd;
int len = sizeof(struct sockaddr);
char buf[MAX_SIZE];
char buffer[MAX_SIZE];
struct sockaddr_in serv_addr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
printf("创建socket失败!");
exit(1);
}
// 填充服务器端信息
bzero(&serv_addr, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr("192.168.192.128");
// 绑定套接字
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) < 0)
{
printf("绑定失败");
exit(1);
}
// 循环接收网络上发送来的数据并回复消息
while (1)
{
if (recvfrom(sockfd, buf, MAX_SIZE, 0, (struct sockaddr *)&serv_addr, &len) < 0)
{
printf("接收失败");
exit(1);
}
printf("recv is: %s\n", buf);
printf("write some text: ");
scanf("%s", buffer);
// 发送数据
if (sendto(sockfd, buffer, MAX_SIZE, 0, (struct sockaddr *)&serv_addr, len) < 0)
{
printf("发送失败");
fprintf(stderr, "send error: %s\n", strerror(errno));
exit(1);
}
}
close(sockfd);
return 0;
}
2.2.2 客户端实现
- 使用socket()函数,创建一个socket
- 设置要连接的对方的ip地址和端口等信息。
- 使用sendto()函数,发送数据
- 关闭网路
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 3212
#define MAX_SIZE 512
int main()
{
int sockfd;
int fromlen = sizeof(struct sockaddr);
char buf[MAX_SIZE];
char buffer[MAX_SIZE];
struct sockaddr_in serv_addr;
// 填充服务端信息
bzero(&serv_addr, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr("192.168.192.128");
// 创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
printf("create socket error!\n");
exit(1);
}
// 循环发送数据到服务端及接收数据
while (1)
{
printf("enter some text: ");
scanf("%s", buf);
// 发送数据
if (sendto(sockfd, buf, MAX_SIZE, 0, (const struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) < 0)
{
printf("recv error!\n");
exit(1);
}
if (recvfrom(sockfd, buffer, MAX_SIZE, 0, (struct sockaddr *)&serv_addr, &fromlen) < 0)
{
printf("recv error!\n");
exit(1);
}
printf("recv is %s\n", buffer);
}
close(sockfd);
return 0;
}