#define HOST_SERVER_IP "192.168.3.35"
#define HOST_PORT 9501
#define SLEEP_TIME 1
#define LOOP_TIME 3
#define DATA_SIZE 80
int judge_socket_exist()
{
int loop_time = 0;
fd_set send_data_flag;
static int socket_fd = -1;
while(1)
{
if (socket_fd <= 0)
{
socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
loop_time++;
}
if (socket_fd > 0)
{
FD_ZERO(&send_data_flag);
FD_SET(socket_fd, &send_data_flag);
FD_SET(0, &send_data_flag);
//check socket is effective
if (select(socket_fd+1, NULL, &send_data_flag, NULL, 0) > 0)
{
break;
}
else
{
socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
loop_time++;
}
}
if (loop_time > LOOP_TIME)
{
return -1;
}
sleep(SLEEP_TIME);
}
return socket_fd;
}
int gsh_post_client(const char* sn, const char* ip)
{
if (NULL == sn || NULL == ip)
{
return -1;
}
int loop_time = 0; //loop time of fail execute
int send_data_length = 0; //length of sending data
int select_err = -1; //flag of select function back value
int socket_fd = judge_socket_exist(); //set socket flag, socket not close
struct timeval select_wait = {1, 0}; //select function wait time
char text[BUFSIZ];
char send_data_buffer[DATA_SIZE]; //buffer of sending data
struct sockaddr_in socket_addr; //socket address of server ip and port
fd_set send_data_flag; //select function send data flag
if (socket_fd <= 0)
{
fprintf(stderr, "establish socket fail");
return -1;
}
//initialize socket data
bzero(&socket_addr, sizeof(socket_addr));
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = htons(HOST_PORT);
inet_aton(HOST_SERVER_IP, &socket_addr.sin_addr);
//initialize request data
memset(&send_data_buffer, 0, sizeof(send_data_buffer));
strcat(send_data_buffer, "sn=");
strcat(send_data_buffer, sn);
strcat(send_data_buffer, "&ip=");
strcat(send_data_buffer, ip);
while(1) //for no-blocking
{
if (loop_time > LOOP_TIME)
{
fprintf(stderr, "send data fail\n");
return -1;
}
FD_ZERO(&send_data_flag);
FD_SET(socket_fd, &send_data_flag);
FD_SET(0, &send_data_flag);
select_err = select(socket_fd+1, NULL, &send_data_flag, NULL, &select_wait);
if (select_err <= 0)
{
loop_time++;
}
else
{
if (FD_ISSET(socket_fd, &send_data_flag))
{
loop_time = 0;
FD_CLR(socket_fd, &send_data_flag);
while(send_data_length < strlen(send_data_buffer))
{
send_data_length = sendto(socket_fd, send_data_buffer, strlen(send_data_buffer), 0, (struct sockaddr *)&socket_addr, sizeof(socket_addr));
if (send_data_length <= 0)
{
fprintf(stderr, "sending data fail\n");
return -1;
}
if (loop_time > LOOP_TIME)
{
fprintf(stderr, "length of sending data shorten than data\n");
return -1;
}
if (send_data_length < strlen(send_data_buffer))
{
loop_time++;
sleep(SLEEP_TIME);
}
}
recvfrom(socket_fd,text,sizeof(text), 0 , NULL, NULL);
printf("%s", text);
break;
}
else
{
loop_time++;
}
}
sleep(SLEEP_TIME);
}
return 0;
}