소켓 프로그래밍 질문 ( 서버 , 클라이트언트 ) 통신 에러
글쓴이: qkrwncks593 / 작성시간: 금, 2012/12/21 - 1:00오후
C언어로 클라이언트에서 아이디와 패스워드를 입력하면 인증이 성공되는 프로그램입니다.
아이디와 패스워드 존재여부는 서버가 처리합니다.
만들었는데 오류가 나더라구요
아래는 클라이언트 소스코드입니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define MAX_BUFFER 1024 typedef struct USERINFO { char ID; char PASS; } USER; USER USERDATA = {{0},{0}}; void Crash_Call(char *msg); int main(int argc, char *argv[]) { WSADATA wsaData; SOCKET hSocket; int strLen; SOCKADDR_IN servAdr; if(argc!=3) { printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) Crash_Call("WSAStartup() error!"); hSocket=socket(PF_INET, SOCK_STREAM, 0); if(hSocket==INVALID_SOCKET) Crash_Call("socket() error"); memset(&servAdr, 0, sizeof(servAdr)); servAdr.sin_family= AF_INET; servAdr.sin_addr.s_addr=inet_addr(argv[1]); servAdr.sin_port=htons(atoi(argv[2])); if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr))) Crash_Call("connect() error!"); else puts("Connected..........."); system("cls"); printf("ID / PASS : "); scanf("%s %s",USERDATA.ID,USERDATA.PASS); send(hSocket, USERDATA.ID, strlen(USERDATA.ID), 0); send(hSocket, USERDATA.PASS, strlen(USERDATA.PASS), 0); system("pause"); closesocket(hSocket); WSACleanup(); return 0; } void Crash_Call(char *msg) { fputs(msg, stderr); fputc('\n', stderr); exit(1); }
이번껀 서버
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #define MAX_BUFFER 256 typedef struct useracc { char ID[20]; char PASS[20]; } USERACC; USERACC USER = {{0},{0}}; USERACC SUSER = {{0},{0}}; void Crash_Call(char * msg) { fputs(msg,stderr); fputc('\n',stderr); exit(-1); } void Connect_Clntinfo(char * msg) { return 0; } int main(int argc, char * argv[]) // 첫번째 인자에는 서버가 사용할 포트번호 기입 { FILE * userfp = NULL; WSADATA wsaData; SOCKET hServSock, hClntSock; SOCKADDR_IN servAddr, clntAddr; int szClntAddr; if(argc!=2) { printf("Usage : %s <port>\n", argv[0]); // 서버가 사용할 포트 입력 exit(1); } if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) Crash_Call("WSAStartup() error!"); hServSock=socket(PF_INET, SOCK_STREAM, 0); if(hServSock==INVALID_SOCKET) Crash_Call("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(argv[1])); if(bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR) Crash_Call("bind() error"); if(listen(hServSock, 5)==SOCKET_ERROR) Crash_Call("listen() error"); szClntAddr=sizeof(clntAddr); hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr); if(hClntSock==INVALID_SOCKET) Crash_Call("accept() error"); if(recv(hClntSock,USER.ID,sizeof(USER.ID)-1,0)) { Crash_Call("recv() error"); } if(recv(hClntSock,USER.PASS,sizeof(USER.PASS)-1,0)) { Crash_Call("recv() error"); } userfp = fopen((char *)USER.ID,"rt"); if(userfp == NULL) { printf("누군가가 계정접속에 실패했습니다!"); return 0; } fgets(SUSER.PASS,256,userfp); if(!(strcmp(SUSER.PASS,USER.PASS))) { puts("Login 성공!"); return 0; } else { puts("fuck!"); } closesocket(hClntSock); closesocket(hServSock); WSACleanup(); return 0; }
Forums:
내용 추가 - 오류내용
클라에서 아이디를 입력하고 엔터를 누르면
응답없음이 뜸니다. 그리고 서버에서는 recv() error 이 발생하구요
클라이언트 소스 코드에서 USERINFO의 ID와
클라이언트 소스 코드에서 USERINFO의 ID와 PASS는 왜 배열이 아닌가요?
보내고 받을 때 스트림 길이를 확인해 보세요.
내가 얼마의 길이로 아이디/패스워드를 보내고 받는지요.
send함수와 recv 함수에서 세번째 파라미터 의미가 어떻게 되는지 다시한번 생각해보세요.
아래 코드를 보면 클라이언트에서 아이디와 패스워드를 이어서 두번 전송하고 서버에서 두번 수신합니다.
서버는 스트림에서 어디까지가 아이디 부분이고 어디부터가 패스워드 부분인지 알수 있을까요?
패킷 스트림을 아래 처럼 그림으로 그려서 생각해보세요.
[e][m][t][y][2][f][i][l][l][p][a][s][s][w][o][r][d]
——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -
이런 방식이 있습니다.
구조체로 보내서 받는건데요.
push 구현하다 말았습니다. ㅡ_ㅡ;;;
걍 보낸대로 받고. 알맞게 잘라주세요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
파일..
파일이 안받아지네요 .. 어떻게 받는거죠?
안올라가네요..
안올라가네요... ㅡ_ㅡ;;; 뭔가 이상하네요...
내일. 다시 정리하고 올려 볼게요...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
ㅎㅎ
감사합니다. ~~
안올라가네요.
ㅇ_ㅇ;;;
걍 링크 겁니다.
https://docs.google.com/open?id=0B_788O9A9oekelhCcF9qV01td1E
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기