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 ;
}
일단 답변부터 드리면 32k data는 UDP로
일단 답변부터 드리면 32k data는 UDP로 안전하게(?) 보낼수 없다 입니다.
아래의 글들 참고하시면 될듯합니다.
http://young2write.wordpress.com/2011/10/17/udp%EC%97%90%EC%84%9C-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EB%B3%B4%EB%82%BC%EC%88%98-%EC%9E%88%EB%8A%94-%ED%8C%A8%ED%82%B7%EC%9D%98-%EC%B5%9C%EB%8C%80-%ED%81%AC%EA%B8%B0%EB%8A%94/
http://kldp.org/node/33816
http://kldp.org/node/25659
"정상 Data"를 보내지 않는 다는 건 어떤 의미인가요?
MTU보다 큰 데이터를 보내려고 하시니 당연히 IP fragmentation이 발생하겠지만 전송에는 특이 사항이 없어야 해 보입니다.
안된다의 정의부터 해주세요. 1.send 함수
안된다의 정의부터 해주세요.
1.send 함수 실패
2.send 함수 성공은 했는데 도착지에서 감지가 안된다.
1의 경우는 에러 코드부터 봐야겠고,
2는 단편화가 100% 일어나는 상황인데 don't frag 됐으면 ICMP로 Too Big Packet 관련 메세지가 옵니다.
일단 문제를 줄여나가시는게 좋겠네요.
"어떻게 된건지 본인도 모르는데 상대방이 소스만 보고 한 눈에 알겠습니까?"
댓글 달기