|
MTU (Maximum transmission unit, the size of the largest packet that a network protocol can transmit)
때문이지 않을까 생각 합니다.
네트웍상에서 최고 큰 패킷의 길이가 보통은 Ethernet 에서 1500으로 설정 되어 있는데
제어용 바이트가 추가 되므로 실제 최고 송수신 가능한 크기는 1500보다 몇바이트 작을겁니다.
단, 이건 가장 큰 패킷의 사이즈를 정한것이지 반드시 상대방이 1400바이트를 보냈다고 해서 내가 1400 바이트를
한번에 수신한다는 보장은 없습니다. 1400 보냈어도 LAN 상의 통신 환경에 따라 700+700 으로 두번 받아야
할 경우도 있습니다.
아무리생각해도.. 님이 쓰신 글 :
: 서버와 클라인트 간에 통신을 하는 프로그램을 만드는데요..
:
: 1450바이트 이하를 한번에는 보내지고 왔다갔다 통신을 잘하는데요.
:
: 1500바이트는 왔다갔다 하지 못하네요..
:
: 이유가 먼지 해결좀 해주세요..ㅠ
:
: [/code] Client
:
: #define BUFSIZE 1455
: short Client(int argc, char **argv)
: {
: WSADATA wsaData;
: SOCKET hSocket;
: char message[BUFSIZE];
: char cancel[16];
: char cancel1[16];
: char message1[BUFSIZE],cDummyBuf[16];
: int iLen =0,nResult, iLen1 =0;
:
: SOCKADDR_IN dummyAddr;
: int dummyLength,buff_len;
: int addrLength;
: SOCKADDR_IN servAddr;
:
: if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
: ErrorHandling("WSAStartup() error!");
: return RTN_TRUE;
: }
:
: hSocket=socket(PF_INET, SOCK_DGRAM, 0);
: if(hSocket == INVALID_SOCKET){
: ErrorHandling("socket() error");
: return RTN_TRUE;
: }
:
: memset(&servAddr, 0, sizeof(servAddr));
: servAddr.sin_family=AF_INET;
:
: memset(cDummyBuf, CH_NULL,sizeof(cDummyBuf));
: ScreenAllSet(" *TCP/IP접속IP* ",
: CH_NULL,
: CH_NULL,
: " [.]SP = '.' ", TRUE);
:
: nResult = InputStyleNum(2, 0, (uchar *)". ",
: StrLen(15, (uchar*)cDummyBuf),
: 15, (uchar *)cDummyBuf, 30);
:
: if(nResult < RTN_FALSE)
: return RTN_TRUE;
:
: servAddr.sin_addr.s_addr=inet_addr((const char*)cDummyBuf);
: servAddr.sin_port=htons(atoi((char*)"9002"));
:
: memset(cancel1,CH_NULL,sizeof(cancel1));
: memset(cancel,CH_NULL,sizeof(cancel));
:
: ScreenAllSet((char*)"Client Test", CH_NULL, CH_NULL, CH_NULL, 1);
:
:
: while(1)
: {
: memset(message,CH_0,sizeof(message));
:
: addrLength = sizeof(servAddr);
: sendto(hSocket, message, strlen(message), 0, (SOCKADDR*)&servAddr, addrLength);
:
: dummyLength = sizeof(dummyAddr);
: buff_len = recvfrom(hSocket, message1, sizeof(message1), 0, (SOCKADDR*)&dummyAddr, &dummyLength);
:
: message1[buff_len]=0;
:
: if(memcmp(message, message1, sizeof(message1))){
: sprintf(cancel,"Cancel = %d",iLen);
: ScreenAllSet((char*)"Cancel", cancel, message, message1, 1);
: Wait(500, WAIT_TIMER);
: iLen++;
: continue;
: }
:
: if(!message1) {
: sprintf(cancel1,"NULL = %d",iLen1);
: ScreenAllSet((char*)"NULL", CH_NULL, cancel, cancel1, 1);
: Wait(500, WAIT_TIMER);
: iLen1++;
: continue;
: }
:
: if(KeyRead() == K_CANCEL){
: ScreenAllSet((char*)"Result", CH_NULL, cancel, cancel1, 1);
: WaitChar(0, WAIT_KEY | WAIT_TIMER, K_ENTER);
: return RTN_CANCEL;
: }
: }
:
: closesocket(hSocket);
: WSACleanup();
: return -1;
: }
:
: [code] server
:
: int Server(int argc, char **argv)
: {
: WSADATA wsaData;
: SOCKET hServSock;
: char message[BUFSIZE];
:
: int strLen;
:
: SOCKADDR_IN servAddr;
: SOCKADDR_IN clntAddr;
: int clntAddrSize;
:
: if(argc!=2){
: ErrorHandling("Port error!");
: }
:
:
: if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
: ErrorHandling("WSAStartup() error!");
:
:
: hServSock=socket(PF_INET, SOCK_DGRAM, 0);
: if(hServSock == INVALID_SOCKET)
: ErrorHandling("socket() error!");
:
:
: memset(&servAddr, 0, sizeof(servAddr));
: servAddr.sin_family=AF_INET;
: servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
: servAddr.sin_port=htons(atoi((char*)"9002"));
:
: if(bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR)
: ErrorHandling("bind() error");
:
: ScreenAllSet((char*)"Server Test", CH_NULL, CH_NULL, CH_NULL, 1);
:
: while(1) {
: clntAddrSize=sizeof(clntAddr);
: strLen = recvfrom(hServSock, message, BUFSIZE, 0, (SOCKADDR*)&clntAddr, &clntAddrSize);
: message[strLen]=0;
: sendto(hServSock, message, strLen, 0, (SOCKADDR*)&clntAddr, sizeof(clntAddr));
:
: }
:
: closesocket(hServSock);
: WSACleanup();
: return -1;
: }
:
: void ErrorHandling(char *message)
: {
: ScreenAllSet((char*)"error", CH_NULL, message, CH_NULL, 1);
:
: exit(1);
: }
|