第1个回答 2022-06-23
客户端
···
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define DEST_PORT 6020
#define DSET_IP_ADDRESS "192.168.1.92"
int main()
{
/* socket锟侥硷拷锟斤拷锟斤拷锟斤拷 */
int sock_fd;
/* udp socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
{
perror("socket");
exit(1);
}
/* 锟斤拷锟斤拷address */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
addr_serv.sin_port = htons(DEST_PORT);
len = sizeof(addr_serv);
int send_num;
int recv_num;
char send_buf[100]={0};
send_buf[0]=0x23;
send_buf[1]=0x23;
send_buf[2]=0x23;
send_buf[3]=0x23;
send_buf[4]=0x4a;
send_buf[5]=0;
send_buf[6]=0;
send_buf[7]=0;
send_buf[8]=0x4a;
send_buf[9]=0;
send_buf[10]=0;
send_buf[11]=0;
send_buf[12]=0x01;
send_buf[13]=0;
send_buf[14]=0;
send_buf[15]=0;
send_buf[16]=0xFF;
send_buf[17]=0xCC;
send_buf[18]=0x0B;
send_buf[19]=0x01;
uint8_t mycheck;
int i=0;
// char recv_buf[20];
while(1){
send_buf[65]=0x01;
for(i=0;i<71;i++)
{
mycheck ^= send_buf[i];
}
send_buf[71]= mycheck;
send_buf[72]=0xEE;
send_buf[73]=0xDD;
//printf("client send: %s\n", send_buf);
sleep(1);
send_num = sendto(sock_fd, send_buf, 74, 0, (struct sockaddr *)&addr_serv, len);
if(send_num < 0)
{
perror("sendto error:");
exit(1);
}
/* recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_serv, (socklen_t *)&len);
if(recv_num < 0)
{
perror("recvfrom error:");
exit(1);
}
recv_buf[recv_num] = '\0';
printf("client receive %d bytes: %s\n", recv_num, recv_buf);
}
close(sock_fd);
return 0;
*/
}}
···
服务器端
...
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define SERV_PORT 6020
int main()
{
/* sock_fd --- socket文件描述符 创建udp套接字*/
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
{
perror("socket");
exit(1);
}
/* 将套接字和IP、端口绑定 */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(struct sockaddr_in)); //每个字节都用0填充
addr_serv.sin_family = AF_INET; //使用IPV4地址
addr_serv.sin_port = htons(SERV_PORT); //端口
/* INADDR_ANY表示不管是哪个网卡接收到数据,只要目的端口是SERV_PORT,就会被该应用程序接收到 */
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址
len = sizeof(addr_serv);
/* 绑定socket */
if(bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(addr_serv)) < 0)
{
perror("bind error:");
exit(1);
}
int recv_num;
int send_num;
char send_buf[20] = "i am server!";
char recv_buf[100];
struct sockaddr_in addr_client;
while(1)
{
printf("server wait:\n");
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, (socklen_t *)&len);
if(recv_num < 0)
{
perror("recvfrom error:");
exit(1);
}
recv_buf[recv_num] = '\0';
printf("server receive %d bytes: %s\n", recv_num, recv_buf);
send_num = sendto(sock_fd, send_buf, recv_num, 0, (struct sockaddr *)&addr_client, len);
if(send_num < 0)
{
perror("sendto error:");
exit(1);
}
}
close(sock_fd);
return 0;
}
...
执行客户端、服务端命令即可: