UDP 데이터 전송시 데이터의 크기가 커지면 send가 안되는 현상.

blueskyhom의 이미지

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 ;
}

익명 사용자의 이미지

MTU보다 큰 데이터를 보내려고 하시니 당연히 IP fragmentation이 발생하겠지만 전송에는 특이 사항이 없어야 해 보입니다.

익명 사용자의 이미지

안된다의 정의부터 해주세요.

1.send 함수 실패
2.send 함수 성공은 했는데 도착지에서 감지가 안된다.

1의 경우는 에러 코드부터 봐야겠고,
2는 단편화가 100% 일어나는 상황인데 don't frag 됐으면 ICMP로 Too Big Packet 관련 메세지가 옵니다.

일단 문제를 줄여나가시는게 좋겠네요.
"어떻게 된건지 본인도 모르는데 상대방이 소스만 보고 한 눈에 알겠습니까?"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.