UDP 데이터 전송시 데이터의 크기가 커지면 send가 안되는 현상.
UDP를 이용해서 Data를 전송하려고 하는데요.
Data부분을 1K로 하면 전송이 되는데 그 이상이 되면 Sendto가 정상 Data를
보내지 않는 것 같은데요..ㅡㅡ;
지금 32K의 Data를 전송하려고 하는데요.. 혹시 무엇때문에 그러는지 조언좀 부탁드립니다.
typedef struct{
int stx;
char data[1024]; <- 요부분을 32K로 바꾸려고 하는데요.
int etx;
} tx_data_t;
int Eth_Client() {
int i, ret, nret = 0;
int eth_send_size = 0;
int mpercent, percent = 0;
char eth_cmd_buf[Eth_Packet_Size];
int sockfd;
struct sockaddr_in server_addr;
socklen_t server_addr_size;
server_addr_size = (socklen_t)sizeof(server_addr);
tx_data_t raw_data;
rx_data_t ret_data;
//UDP Setting
memset((void*)&raw_data, 0, sizeof(raw_data));
memset((void*)&ret_data, 0, sizeof(ret_data));
raw_data.stx = fstx;
raw_data.etx = fetx;
raw_data.totlen = Eth_TOTL_LEN;
//Dpram Reset
Dpram_Cmd->progress = 0;
Dpram_Cmd->completed = 0;
sockfd = socket(PF_INET, SOCK_DGRAM, 0);
if(sockfd < 0) {
printf("Ethernet Socket Fail..!");
nret = Err_EthSocket;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; //IP type IPv4
server_addr.sin_port = htons(Eth_Config.port); //Port Number
server_addr.sin_addr.s_addr = inet_addr(Eth_Config.server_ip); //32bit IP type
for(i = 0 ; i < (Eth_TOTL_LEN / sizeof(raw_data.data)) ; i++)
{
if(nret != 0) {
Dpram_Cmd->progress = 100;
break;
}
//create Data
Buf_Create(eth_cmd_buf, sizeof(eth_cmd_buf));
memcpy(raw_data.data, eth_cmd_buf, sizeof(eth_cmd_buf));
raw_data.datalen = sizeof(eth_cmd_buf);
//send data
ret = sendto(sockfd, (void*)&raw_data, sizeof(raw_data), 0,
(struct sockaddr*)&server_addr, server_addr_size);
printf("Complete Send! Size[%d] Data Size[%d] \n", sizeof(raw_data), sizeof(raw_data.data));
if(ret < 0) {
printf("Complete Error!\n");
nret = Err_EthSend;
}
ret = recvfromtimeout(sockfd, 30, 0);
if(ret > 0) {
//recv data
ret = recvfrom(sockfd, (void*)&ret_data, sizeof(ret_data), 0,
(struct sockaddr*)&server_addr, &server_addr_size);
printf("Complete Recv! Data Size[%d] \n", sizeof(ret_data.ret_data));
if((ret_data.stx == fstx) && ( ret_data.etx == fetx)) {
//Ethernet Data Check
ret = memcmp(ret_data.ret_data, raw_data.data, sizeof(raw_data.data));
if(ret == 0) {
printf("Match Data!");
eth_send_size = eth_send_size + sizeof(raw_data.data);
mpercent = Percnet(0, Eth_TOTL_LEN, eth_send_size);
if(percent != mpercent) {
percent = mpercent;
Dpram_Cmd->progress = percent;
printf(" Send..[%d]\n", Dpram_Cmd->progress);
}
}
else {
printf("MissMatch Data!\n");
nret = Err_EthCompare;
break;
}
//WLAN Connect Check
if(ret_data.wlan_state) {
printf("Ping : %d, Success : %d, Fail : %d\n",
ret_data.ping_cnt, ret_data.success_cnt, ret_data.fail_cnt);
}
else {
printf("WLAN No Connet!\n");
nret = Err_EthWLANConnect;
break;
}
}
else {
printf("Recv stx, etx Error!\n");
nret = Err_EthRecvHead;
break;
}
}
else {
printf("recvfrom Timeout Error!\n");
nret = Err_EthRecvTimeout;
break;
}
printf("\n");
}
close(sockfd);
sleep(1);
if(nret == 0) {
printf("Eth_Send_Sucess.!\n");
Dpram_Cmd->completed = 1;
}
return nret ;
}
댓글 달기