#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#define IP "127.0.0.1"
#define
#define
// typedef uint32_t in_addr_t;
// gcc data_process.c -o data_process -pthread
int cfd = -1,data_fd = -1;
uint32_t receive_ip = -1;
void *receive(void *pth_arg)
{
int ret = 0;
char name_data[3] = {0};
struct sockaddr_in addr0 = {0};
int addr0_size = sizeof(addr0);
while (1)
{
printf("receive:");
bzero(name_data, sizeof(name_data));
ret = recvfrom(cfd, name_data, sizeof(name_data), 0, (struct sockaddr *)&addr0, &addr0_size);
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "recv failed", strerror(errno));
exit(-1);
}
else if (ret > 0)
{
printf("\nname = %s ", name_data);
printf("ip %s,port %d \n", inet_ntoa(addr0.sin_addr), ntohs(addr0.sin_port));
}
}
}
void *data_receive(void *pth_arg)
{
int ret = 0;
char name_data[10] = {0};
struct sockaddr_in addr0 = {0};
int addr0_size = sizeof(addr0);
while (1)
{
bzero(name_data, sizeof(name_data));
ret = recvfrom(data_fd, name_data, sizeof(name_data), 0, (struct sockaddr *)&addr0, &addr0_size);
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "recv failed", strerror(errno));
exit(-1);
}
else if (ret > 0)
{
printf("\nname = %s ", name_data);
printf("ip %s,port %d \n", inet_ntoa(addr0.sin_addr), ntohs(addr0.sin_port));
receive_ip = addr0.sin_addr.s_addr;
char buf[20] = { 0 };
inet_ntop(AF_INET, &receive_ip, buf, sizeof(buf));
printf("receive_ip ip = %s ", buf);
// printf("receive_ip ip = %s ", inet_ntop(receive_ip));
break;
}
}
}
int main()
{
int ret = -1;
data_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == data_fd)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "socket failed", strerror(errno));
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = AF_INET; //設置tcp協議族
addr.sin_port = htons(DATA_PORT); //設置端口號
addr.sin_addr.s_addr = inet_addr(IP); //設置ip地址
ret = bind(data_fd, (struct sockaddr *)&addr, sizeof(addr));
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "bind failed", strerror(errno));
exit(-1);
}
pthread_t receive_id;
ret = pthread_create(&receive_id, NULL, data_receive, NULL);
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno));
exit(-1);
}
pthread_join(receive_id,NULL);
cfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == cfd)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "socket failed", strerror(errno));
exit(-1);
}
struct sockaddr_in addr1;
addr1.sin_family = AF_INET; //設置tcp協議族
addr1.sin_port = htons(PORT); //設置端口號
addr1.sin_addr.s_addr = receive_ip; //設置ip地址
char buf[20] = { 0 };
inet_ntop(AF_INET, &receive_ip, buf, sizeof(buf));
printf("ip = %s ", buf);
ret = bind(cfd, (struct sockaddr *)&addr1, sizeof(addr1));
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "bind failed", strerror(errno));
exit(-1);
}
pthread_t id;
ret = pthread_create(&id, NULL, receive, NULL);
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno));
exit(-1);
}
pthread_join(id,NULL);
struct sockaddr_in addr0;
addr0.sin_family = AF_INET; //設置tcp協議族
addr0.sin_port = htons(6000); //設置端口號
addr0.sin_addr.s_addr = inet_addr(IP); //設置ip地址
char name_send[3] = {0};
while (1)
{
bzero(name_send, sizeof(name_send));
printf("send name:");
scanf("%s", name_send);
ret = sendto(cfd, (void *)name_send, sizeof(name_send), 0, (struct sockaddr *)&addr0, sizeof(addr0));
if (-1 == ret)
{
fprintf(stderr, "%d, %s :%s", __LINE__, "accept failed", strerror(errno));
exit(-1);
}
}
return 0;
}