안녕하세요 C++ 으로 소켓통신을 하는건데요.
조회수 4062회
안녕하세요 코딩 초보입니다.
server와 client를 만들어 서로 한번씩 메세지를 전송하는 코드를 만들어야하는데
감이 잡히지 않아요 ...
서버코드는 일단 이렇구요
#pragma comment(lib, "ws2_32")
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#define SERVERPORT 9000
int main(int argc, char *argv[])
{
int retval;
// 윈속 초기화
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) return 1;
// socket()
SOCKET listen_sock = socket(AF_INET, SOCK_STREAM, 0);
// bind()
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(SERVERPORT);
retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
// listen()
retval = listen(listen_sock, SOMAXCONN);
// 데이터 통신에 사용할 변수
SOCKET client_sock;
SOCKADDR_IN clientaddr;
int addrlen;
char x;
while(1){
// accept()
addrlen = sizeof(clientaddr);
client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);
// 접속한 클라이언트 정보 출력
printf("\n[TCP 서버] 클라이언트 접속: IP 주소=%s, 포트 번호=%d\n",
inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
// 클라이언트와 데이터 통신
while(1){
// 데이터 받기
retval = recv(client_sock, &x, sizeof(char), 0);
if(retval == SOCKET_ERROR || retval == 0) break;
// 받은 데이터 출력
printf("%c", x);
}
// closesocket()
closesocket(client_sock);
}
// 리슨 소켓 종료
closesocket(listen_sock);
// 윈속 종료
WSACleanup();
return 0;
}
클라이언트는 이렇습니다.
#pragma comment(lib, "ws2_32")
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define SERVERIP "127.0.0.1"
#define SERVERPORT 9000
int main(int argc, char *argv[])
{
int retval;
// 윈속 초기화
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) return 1;
// 소켓 생성
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET) exit(1);
// 소켓 설정
SOCKADDR_IN serveraddr;
ZeroMemory(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(SERVERIP);
serveraddr.sin_port = htons(SERVERPORT);
// 연결 요청
retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
if(retval == SOCKET_ERROR) exit(1);
// 서버와 데이터 통신
char x;
while(1) {
x = getche();
retval = send(sock, &x, sizeof(char), 0);
}
// 소켓 종료
closesocket(sock);
// 윈속 종료
WSACleanup();
return 0;
}
이걸 베이스로 만들어야하는데
while 부분을 수정하고 buffer도 만들어서 저장했다가 메세지를 주고받아야 할 거같은데
감이 잡히지 않아요.
아래는 클라이언트 부분의 while 을 수정해 본거에요. while부분 위쪽은 그냥 추가해 준 것이구요.
거의 뇌피셜 급으로 작성해서인지 잘안되는 것 같습니다.
#include BUFSIZE 1024
하고 내려와서
char message[BUFSIZE];
로 선언해줬어요
while(1) {
if(true){
retval=recv(sock,message,sizeof(message),0);
if(retval == SOCKET_ERROR || retval == 0)
printf("받은메세지:%s\n",message); break;
}
if(true){
retval = send(sock, message, sizeof(message), 0);//
if(retval == SOCKET_ERROR || retval == 0) break;
}
printf("대기중입니다");
}
무슨 생각으로 코드를 작성했냐면 recv 로 메세지를 받았을때 이를 출력하고 이제 서버쪽에서는 메세지를 그만 받고 출력하고 break로 빠져나옵니다. 그리고 클라이언트가 메세지를 작성하는 상태로 와요 여기서도 계속 입력을 받아서 작성하다가 retval=SOCKET_ERROR 이거나 retval이 0 이면 빠져나오고 대기중입니다.를 출력하고 while(1)이니 다시 수신단으로 올라가게 하고싶은데.. 문제는 저렇게 걸어논 if문이 맞는지 사실 잘 모르겠어요 enter 입력을 받아서 if문에 그게 들어오면 그냥 메세지 출력하면서 break로 나가게 구성하는 것과 같은 건지요 .. ㅠㅠ
코딩이 귀찮으시다면 어디어디를 어떻게 구성하고 수정하면 될 것 같다 조언 부탁드려요 감사합니다!
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력