수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

tcp/ip 소켓 질문있습니다~!

Judicious

2023.04.01

질문 제목 : 질문 내용 :
우선 여기서 매번 질문올려서 좋은답변받아서 잘 활용하고 있는거 감사드립니다!
제가 지금 개발하는 보드가 wifi 무선 모듈입니다 그래서 이것이 클라이언트가되고

제 pc가 서버가 되어서 데이터를 주고받는것을 테스트하고있는데요우선 제 서버쪽 코드가
#include stdio.h
#include time.h
#include winsock2.h

#pragma comment ( lib, ws2_32.lib )void main()
{
wsadata wsadata;
socket s;
socket cs;
struct sockaddr_in sin;
struct sockaddr_in cli_addr;
int size = sizeof(cli_addr);
char data[1000] = {0,};
int ret;
int cnt=1;

if( wsastartup(winsock_version, &wsadata ) != 0 )
{
printf(wsa실패, 에러코드 = %d\n, wsagetlasterror());
return;
}
s = socket( af_inet, sock_stream, ipproto_tcp );
if( s == invalid_socket) {
printf(소켓 생성실패, 에러코드 = %d\n, wsagetlasterror());
wsacleanup();
return;
}
printf(소켓생성!!!\n);
sin.sin_family = af_inet;
sin.sin_port = htons(10000);
sin.sin_addr.s_addr = htonl(addr_any);
if( bind(s, (struct sockaddr*)&sin, sizeof(sin)) == socket_error ) {
printf(바인드 실패, 에러코드 = %d\n, wsagetlasterror());
closesocket(s);
wsacleanup();
return;
}
printf(ip할당성공!!!\n);

if(listen(s,somaxconn) != 0) {
printf(리슨실패, 에러코드 = %d\n, wsagetlasterror());
closesocket(s);
wsacleanup();
return;
}
printf(listen 성공!!!\n);

cs=accept(s,(struct sockaddr*)&cli_addr,&size);
printf(accept 성공!!!\n);
if(cs == invalid_socket)
{
printf(접속 실패, 에러코드 = %d\n, wsagetlasterror());
closesocket(s);
wsacleanup();
return;
}
printf(rtd pc server!!!\n);
printf(waiting for rtd data..!\n);
while( 1 ) {
memset(data,0,sizeof(data));
ret = recv(cs,data,1000,0);

if(ret == socket_error)
{
printf(error로 들어온 recvdata : %s\n, data);
printf(error로 들어온 ret : %d\n, ret);
printf(데이터 수신 실패, 에러코드 = %u\n, wsagetlasterror());
sleep(1000);
closesocket(cs);
closesocket(s);
wsacleanup();
return;
}
printf(%s가 %d회 server로 수신되었습니다.\n,data,cnt);
sleep(1000);
send(cs,data,ret,0);
printf(%s가 %d회 rtd로 송신되었습니다.\n,data,cnt);
cnt++;//추가
}
if(closesocket(cs)!=0||closesocket(s)!=0)
{
printf(소켓 제거 실패, 에러코드 = %u\n, wsagetlasterror());
wsacleanup();
return;
}
if(wsacleanup()!=0)
{
printf(wsacleanup 실패, 에러코드 = %u\n, wsagetlasterror());
return;
}
}

이것입니다. 아주 간단한 서버입니다 그냥 데이터가 몇회주고받는지만 확인하려고만든것입니다.
근데 여기서 질문이있습니다.

제 모듈(클라이언트)에서 소켓을 닫아버릴수있는데요
그럼 저 서버쪽에선 어떻게 돌아가는게 정상인가요?

aaaa라는 데이터를 한번보내고나서
지금 강제로 닫아보면
aaaa가 1회 수신되엇습니다
aaaa가 1회 송신되었습니다
가 2회 수신되엇습니다
가 2회 송신되었습니다
가 3회 수신되엇습니다
가 3회 송신되었습니다
데이터 수신 실패, 에러코드=10053
이런식으로 되며 종료가됩니다 .
이것이 정상 동작인가요?
이렇게되면 서버쪽은 자동으로 소켓이 닫히는건가요?

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

  • 바르고

    정말 감사합니다
    많은 부분이 도움이 되었습니다!
    그리고 질문하나만 글더써서 더하겠씁니다!

  • 민아

    추가적으로..이건 굳이 하시지 않아도 그다지 문제는 없다고 생각되지만..
    WSAStartup이 실패하면 WSAGetLastError도 호출하실수 없는 상황입니다..
    반드시 WSAStartup이 성공하셔야만 WSAGetLastError도 호출이 가능하십니다.

    대신 WSAStartup이 실패할 경우 WSAStartup함수 자체가 구체적인 오류코드를 리턴합니다..
    그래서

    if( WSAStartup(WINSOCK_VERSION, &wsadata ) !=

  • 기쁨해

    recv가 SOCKET_ERROR가 나오더라도, 보통 상대편에서 abortive close를 한 경우
    WSAGetLastError의 결과가 WSAECONNABORTED(10053)이 아니라
    WSAECONNRESET(10054)이 뜬다고 알고 있습니다.

    그리고 recv가 실패했든 성공했든 소켓은 마지막에 닫아줘야 합니다(즉 아직 닫힌게 아닙니다).
    SOCKET_ERROR를 리턴했다고 하더라도 closesocket을 생략하시게 되면
    리소스 릭입니다.

  • 일본드립

    recv의 리턴값이 0인지 체크하는 부분도 추가하셔야 하지 않을까 싶네요.
    ret = recv(cs,data,1000,0);
    if(ret == SOCKET_ERROR || ret == 0)
    {
    //printf(\error로 들어온 recvdata : %s\\n\

  • 주인님

    네 하나의 클라이언트하고만 주고받을수있으면 됩니다.
    지금 저상황에서 클라이언트에서 소켓을 닫아버리면
    저렇게 결과가 나오는것이맞나요??

  • 매미꽃

    작성하신 프로그램은 오직 한 클라이언트 하고만 연결을 요청받고 데이터 처리를 한후 종료하는 심플한 서버네요. 연결 요청이 들어왔을 때 beginthread 함수를 호출해 N개의 클라이언트 요청을 처리하는 방법이 있어요. 이건 프로그램 설계 혹은 구조의 문제일 뿐이고 의도하신데로 잘 만드신거 같네요.

번호 제 목 글쓴이 날짜
2700313 파일 읽어서 저장하는데 빈파일일 경우 문재가 발생하네요.. (2) 크나 2025-07-03
2700287 구조체 동적할당 연습을 하는데 오류가 뜹니다...(해결) (3) 아련나래 2025-07-03
2700264 문자와 숫자 동시에 입력??? 글고운 2025-07-03
2700236 txt파일로만 쓰고 읽게 하려면 어떻게 해야 하나요..?? (8) 미국녀 2025-07-03
2700211 전위 연산자 (2) 어른처럼 2025-07-02
2700183 C에서 파일이름을 받고, 그 파일의 사이즈를 출력해줘야하는데 내용이 출력이 안되네요 ;ㅅ; 피스케스 2025-07-02
2700150 꼭좀 도와주세요ㅠㅠㅠ 호습다 2025-07-02
2700095 연산문제...질문... 오빤테앵겨 2025-07-01
2700070 while문 , 3의배수 출력하는 프로그램좀 짜주세욤. 횃불 2025-07-01
2700041 초보인데요 ㅎ 배열안에 배열을 집어넣을수 있나요?? 헛장사 2025-07-01
2700012 배열// (1) 전갈자리 2025-07-01
2699895 무한루프에 빠집니다.!! 해결좀부탁드려요 (10) 선아 2025-06-30
2699842 질문을 너무 많이 하네여.....죄송.... (2) 해님꽃 2025-06-29
2699816 오류 질문입니다.. (1) 해비치 2025-06-29
2699763 질문입니다 ! 꼭 좀 도와주세요ㅠㅠ (2) 미라 2025-06-28
2699555 c언어 다항식을 입력을 했는데 왜 출력이 안될까요? 피스케스 2025-06-27
2699528 C언어 포인터연산 질문입니다. (3) 안녕나야 2025-06-26
2699476 끌어올림;;달력 짜봤는데요 이 소스 줄일 수 있나요? - 스샷첨부 (2) 클라우드 2025-06-26
2699444 [좀 급함] system("explorer [주소] ") 문에 변수를 사용할 수 있나요? 알 2025-06-26
2699415 파일//read//와 배열 아란 2025-06-25
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com