C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[59102] Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요..
nansama [nansama] 1166 읽음    2009-11-13 20:30
보통은 통신 할때 간단하게라도 전문의 포멧을 구성 합니다.
전문의 젤 처음 부분에 내가 보내고 싶은 크기, 내 전문의 종류 등 을 정의 한다음 데이타를 송신 합니다.
그럼 받는 쪽에서 앞부분의 내용을 보고 '아 99999 바이트짜리 123 전문을 보냈구나 등으로 판단 할수 있고
통신 오류가 아닌한은 99999 바이트를 모두 수신 할때까지 계속 recv를 하시면 됩니다.
send 하시는 쪽에서도 보통 4k 이상이 한번에 송신이 안됩니다. O/S의 TCP 송신 버퍼가 작기 때문에
send 하는 쪽도 4k 이상을 보낼때는 send 에 성공한 다음 데이타 부터 이어서 송신 하는 루틴이 필요 합니다.
더 자세한건 송수신 강좌 같은걸 찾아보세요.

아무리생각해도.. 님이 쓰신 글 :
: 그럼 이것을 해결할수 있는 방법은 머가 있을까요??
:
: nansama 님이 쓰신 글 :
: : 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);
: : : }

+ -

관련 글 리스트
59099 소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아무리생각해도.. 1240 2009/11/13
59100     Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. nansama 1187 2009/11/13
59101         Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아무리생각해도.. 1181 2009/11/13
59120             Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. 아제나 1439 2009/11/16
59102             Re:Re:Re:소켓 프로그램인데요.. 머가 잘 못된걸까요.. nansama 1166 2009/11/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.