소켓 프로그래밍 질문 ( 서버 , 클라이트언트 ) 통신 에러

qkrwncks593의 이미지

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;
}
qkrwncks593의 이미지

클라에서 아이디를 입력하고 엔터를 누르면

응답없음이 뜸니다. 그리고 서버에서는 recv() error 이 발생하구요

empty2fill의 이미지

클라이언트 소스 코드에서 USERINFO의 ID와 PASS는 왜 배열이 아닌가요?

보내고 받을 때 스트림 길이를 확인해 보세요.

내가 얼마의 길이로 아이디/패스워드를 보내고 받는지요.

send함수와 recv 함수에서 세번째 파라미터 의미가 어떻게 되는지 다시한번 생각해보세요.

아래 코드를 보면 클라이언트에서 아이디와 패스워드를 이어서 두번 전송하고 서버에서 두번 수신합니다.

서버는 스트림에서 어디까지가 아이디 부분이고 어디부터가 패스워드 부분인지 알수 있을까요?

패킷 스트림을 아래 처럼 그림으로 그려서 생각해보세요.

[e][m][t][y][2][f][i][l][l][p][a][s][s][w][o][r][d]

        // 클라이언트
	send(hSocket, USERDATA.ID, strlen(USERDATA.ID), 0);
	send(hSocket, USERDATA.PASS, strlen(USERDATA.PASS), 0);
 
        // 서버
	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");
	}

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

shint의 이미지

구조체로 보내서 받는건데요.
push 구현하다 말았습니다. ㅡ_ㅡ;;;

걍 보낸대로 받고. 알맞게 잘라주세요.

댓글 첨부 파일: 
첨부파일 크기
Package icon 소켓 메시지 전송.zip7.41 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

qkrwncks593의 이미지

파일이 안받아지네요 .. 어떻게 받는거죠?

shint의 이미지

안올라가네요... ㅡ_ㅡ;;; 뭔가 이상하네요...
내일. 다시 정리하고 올려 볼게요...

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

qkrwncks593의 이미지

감사합니다. ~~

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.