web과 소켓통신 연동하는 부분에서 문의드립니다.

shean0의 이미지

계속 자료를 찿고 있는데.. 어떻게 해야할지 답답하여. 도움을 청합니다.

<<로그 참고 ] SAF로 시작하는 부분부터가 그림데이터 입니다.>>
[4번째 추가]::연결은 keep_alive로 하지 않고, close로 할것 입니다.
keep_alive로 하였더니 socket에서read의 리턴이 안되는 현상이 있더군요.
소켓연결이 끊겨지고, 그리고 read문이 리턴 되기 위해서는 close로 해야 할듯 합니다.. 맞죠??

지금 하려는 작업은
FORM ENCTYPE="multipart/form-data" ACTION="http://xxx.xxx.xxx.xxx/send_pic.asp" METHOD="POST" name="form1"> 에서 이미지를 첨부하여 보내구 , text결과를 웹으로 전달받으면 됩니다.

그래서 80포토로 접속하고, 이제 데이터를 만들어야 하는데..
가장 간단한 방법이라 생각되어, rfc문서를 읽고(외우지는 못했습니다)
Ethereal 프로그램을 사용해서 데이터 부분만 sprintf로 버퍼에 넘겨주면 되겠다 싶었습니다.
그런데.. 캡쳐 로그를 보는 순간.. 2군데 이해가 안되는 부분이 있습니다.

1 Content-Type: multipart/form-data; boundary=---------------------------7d42792f80470 여기서 boundary값이 데이터 값이 바뀌면 boundary값도 바뀌는 현상이 있습니다. 이 boundary의 값이 의미하는 것이 무엇인지요? 단어뜻 그대로 경계...음..

2 Content-Length: 3576 여기서 length는 body의 길이라고 알고 있습니다.
[code:1]Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDGGGQGESY=LNDPBJPAFGHKGMILABBOBPDG

凄:@? ? ? 揆/?P?퉐 E 킍?

File attachments: 
첨부파일 크기
Plain text icon qa_send_pic_0225.txt5.25 KB
shean0의 이미지

에구.. 질문의 요지를 제대로 표현하지 못했나 보네요.
상황 설명을 하다보니..

요약하면 ethereal 프로그램으로 통신을 캡쳐하였구.
이 캡쳐 데이터를 바탕으로 sprintf, memcpy로 데이터 부분만 바꾸면 되겠다라는 생각이 들었습니다.

그런데 여기서 2가지 값 설정이 어디에서 나오는 값인지 유추가 되지 않았습니다.

1 .번재는 boundary 값이구.
2. length 값을 계산하기가.. 만만치 않더군요.
저는 파일을 업로드 하는 것인데. 당연이 이 업로드되는 파일크기는 미리 알수 있습니다. 다만 text필드에 들어가는 값이 가변이죠.

음.. 이 상황에서 조언을 부탁드립니다..

언제나 즐프를 꿈꾸며~

choissi의 이미지

boundary 뒤에 나오는 값은 임의의 값입니다.
보내는 사람이 랜덤하게 값을 설정한후에 사용하시면 됩니다.

그리고 길이 값은, 어짜피 base64로 인코딩 된 상태이기 때문에 그냥 파일 사이즈를 읽어서는 안되고
post할 데이터를 다 만든다음 문자열 길이 함수로 읽으면 될것 같습니다. (post될 데이터에는 널이 없으므로)

덧붙이지만 post 데이터를 만들때 바꿔치지로는 한계가가 있으니, buffer 하나씩 그려나가는게 더 효과적일 겁니다.

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

shean0의 이미지

지금 그림올려보내는 것은 아직 안되었지만...

말씀하신 boundry를 적용하여.
boundary=THIS_STRING_SEPARATES 이렇게 적용하였습니다.
그런데..

boundary=THIS_STRING_SEPARATES 


Content-Disposition: form-data; name=\"origCTN\"

123456789   
THIS_STRING_SEPARATES

위의 예에서는 [123456789 ] 입력하면
echo값을 내려 받는데.. [123456789]

[123456789]<--- 3바이트 space+\n 을 넣지 않으면
서버에서 echo "origCTN[$origCTN]<br>"로 테스트 시에
[123456]으로 나옵니다.

[789]3바이트가 끊기는 것은 왜 일까요?

언제나 즐프를 꿈꾸며~

shean0의 이미지

choissi wrote:

길이 값은, 어짜피 base64로 인코딩 된 상태이기 때문에 그냥 파일 사이즈를 읽어서는 안되고
덧붙이지만 post 데이터를 만들때 바꿔치지로는 한계가가 있으니, buffer 하나씩 그려나가는게 더 효과적일 겁니다.


음.. 아래처럼 하면 안된다는 말씀인지??

고정된부분은 define으로처리
boundary=THIS_STRING_BOUNDARY

#define BODY_SIS_WEB "THIS_STRING_BOUNDARY
Content-Disposition: form-data; name=\"imgFile\"; filename=\"testinput.sis\"
Content-Type: application/octet-stream

"
#define BODY_SIS_NULL "


" 

그림파일의 크기만큼 임시 SisDat메모리로 카피
fp=fopen("testinput.sis","rb");
	fseek(fp,0,SEEK_END);
	file_length=ftell(fp);
	printf("   SIS image size[%d]\n",file_length);
	fseek(fp,0,SEEK_SET);
	ret=fread(SisData,1,file_length,fp);
	if(ret != file_length )
	{
		printf("ret[%d]\n",ret); 	
	}
	fclose(fp);

파일정보 카피 + 그림카피 + \r\n\r\n  + [ boundary 다음 데이터] 
memcpy(&KTF_DATA[p], BODY_SIS_WEB,strlen(BODY_SIS_WEB));
	p += strlen(BODY_SIS_WEB);

	memcpy(&KTF_DATA[p], SisData,      file_length    );
	p += file_length; 
	
	memcpy(&KTF_DATA[p], BODY_SIS_NULL,strlen(BODY_SIS_NULL));
	p += strlen(BODY_SIS_NULL);

이런식으로 구성하였습니다.
1 :text테이터는 제대로 올라가는데 .. 왜 파일만 안 올라가는지..이해가 안되네요.
2 :앞의 질문[3바이트<아마두 \r\n\r\n 의 4바이트 일듯.. 하지만>도 이해가 안되구요]

언제나 즐프를 꿈꾸며~

shean0의 이미지

도저히 파일 전달이 되지않어.. 축소해서 테스트 중입니다.
어디가 문제인지..

아래 define은 이더리얼로 캡쳐한것이구..
no cache

쓰레기값 ---bounday형식으로 되어있어.. 쓰레기값만 삭제하여 define으로 정의하여 서버로 보낸것입니다.

아래소스는
write하기 전에 버퍼를 %c로 찍은값입니다.
test.txt 에 12345 5글자만을 찍어서 저장하고 전달하려구 줄였습니다.
[여기부터]까지 데이터

[
#define TEST "POST /TEST_SEND_WEB/m_send_notip.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: ko
Content-Type: multipart/form-data; boundary=---------------------------7d421402805e6
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: 2xx.xx.xx.x0
Content-Length: 353
Connection: close
Cache-Control: no-cache

-----------------------------7d421402805e6
Content-Disposition: form-data; name=\"USR_ID\"

123456789
-----------------------------7d421402805e6
Content-Disposition: form-data; name=\"imgFile\"; filename=\"test.txt\"
Content-Type: text/plain

12345
-----------------------------7d421402805e6--"

max는 충분히 큽니다.
char DATA[MAX]; memset(DATA,0x0,sizof(DATA));
memcpy(DATA,  TEST,  strlen(TEST));
write_len(sok,DATA,strlen(TEST)); 이렇게 하였습니다.

서버쪽소스는

if( isset($imgFile) )
{
		$file_path="./test.sis";
		echo "파일이름:$imgFile_name<br>";
		echo "파일크기:$imgFile_size<br>";
		echo "파일형식:$imgFile_type<br>";
		echo "file_path:$file_path<br>";

		// 업로드된 파일을 저장할 장소에 카피

	if(! copy($imgFile,$file_path) )
	{
		echo "imgFile upload 실패<br>";

	}
	else
	{
		echo "upload 성공<br>";
	}//<==upload 성공
}
else echo "파일없음 <br>"; 

결과는 언제나 "파일없음"이네요.. 간단한 텍스트 화일조차도 전달이 안되는데..
이게 뭔 일인지..
file_name은 test.txt로 넘어오는데..
바운더리도 맞구.. 뭐가 문제인지.

결과
파일없음 <br>USR_ID[12345678] <= 아직두 짧다..쩝.

언제나 즐프를 꿈꾸며~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.