<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EA%B9%80%ED%9D%AC%EC%84%B1%2F%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8</id>
	<title>김희성/리눅스계정멀티채팅2차 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EA%B9%80%ED%9D%AC%EC%84%B1%2F%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;action=history"/>
	<updated>2026-05-15T21:47:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45310&amp;oldid=prev</id>
		<title>imported&gt;hsebs at 12:31, 7 April 2012</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45310&amp;oldid=prev"/>
		<updated>2012-04-07T12:31:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:31, 7 April 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l722&quot;&gt;Line 722:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 722:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 터미널 세로 크기가 20 이하일 경우 화면이 꼬임&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 터미널 세로 크기가 20 이하일 경우 화면이 꼬임&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 메세지 작성 중, 다른 유저가 메세지를 보낼 시 작성 중이던 부분이 보이지 않음.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 메세지 작성 중, 다른 유저가 메세지를 보낼 시 작성 중이던 부분이 보이지 않음.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ID 최대 생성 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;갯수가 100개임&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* ID 최대 생성 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;갯수를 넘을 시 렉이 걸림&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 부재 중 대화 내역이 100개가 넘을시 그 이전 기록은 볼 수 없음&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 기타 사항 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 기타 사항 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 서버 주소가 127.0.0.1(loopback)로 설정되어있음.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 서버 주소가 127.0.0.1(loopback)로 설정되어있음.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;hsebs</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45309&amp;oldid=prev</id>
		<title>imported&gt;hsebs at 12:28, 7 April 2012</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45309&amp;oldid=prev"/>
		<updated>2012-04-07T12:28:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:28, 7 April 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l715&quot;&gt;Line 715:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 715:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 리눅스 멀티 채팅&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 리눅스 멀티 채팅&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 계정 생성 및 비밀번호 생성&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 계정 생성 및 비밀번호 생성&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 계정으로 로그인시 부재 중 대화 내역을 볼 수 있음&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 동시접속 최대 20명까지 가능&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 아이디 최대 100개까지 생성 가능&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 간단한 명령어 가능 (명령어 목록 보기, 접속 인원 보기, 귓속말)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 간단한 명령어 가능 (명령어 목록 보기, 접속 인원 보기, 귓속말)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 버그 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 버그 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;hsebs</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45308&amp;oldid=prev</id>
		<title>imported&gt;hsebs at 12:27, 7 April 2012</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45308&amp;oldid=prev"/>
		<updated>2012-04-07T12:27:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:27, 7 April 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l719&quot;&gt;Line 719:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 719:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 터미널 세로 크기가 20 이하일 경우 화면이 꼬임&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 터미널 세로 크기가 20 이하일 경우 화면이 꼬임&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 메세지 작성 중, 다른 유저가 메세지를 보낼 시 작성 중이던 부분이 보이지 않음.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 메세지 작성 중, 다른 유저가 메세지를 보낼 시 작성 중이던 부분이 보이지 않음.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* ID 최대 생성 갯수가 100개임.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 기타 사항 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 기타 사항 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 서버 주소가 127.0.0.1(loopback)로 설정되어있음.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 서버 주소가 127.0.0.1(loopback)로 설정되어있음.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>imported&gt;hsebs</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45307&amp;oldid=prev</id>
		<title>imported&gt;hsebs at 12:25, 7 April 2012</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B9%80%ED%9D%AC%EC%84%B1/%EB%A6%AC%EB%88%85%EC%8A%A4%EA%B3%84%EC%A0%95%EB%A9%80%ED%8B%B0%EC%B1%84%ED%8C%852%EC%B0%A8&amp;diff=45307&amp;oldid=prev"/>
		<updated>2012-04-07T12:25:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 서버 ==&lt;br /&gt;
 #include&amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;stdlib.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;string.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;unistd.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;arpa/inet.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;sys/types.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;sys/socket.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;pthread.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define BUFF_SIZE 1024&lt;br /&gt;
 &lt;br /&gt;
 #define ACCEPT 0&lt;br /&gt;
 #define REJECT 1&lt;br /&gt;
 #define DISCONNECT -1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int thread_num[25];	//스레드 번호 (해당 스레드 활성화시 번호 값 + 1, 비활성화시 0)&lt;br /&gt;
 			//ex) thread_num[스레드 번호]==스레드 번호+1&lt;br /&gt;
 &lt;br /&gt;
 int thread_id[25];	//스레드 ID 번호&lt;br /&gt;
 			//ex) 스레드 아이디 = id[thread_id[스레드 번호]]&lt;br /&gt;
 &lt;br /&gt;
 int client_socket_array[25];	//클라이언트 소캣, 각 스레드 마다 자신의 번호에 해당하는 소캣 사용&lt;br /&gt;
 				//ex) 스레드가 사용 중인 소캣 == client_socket_array[스레드 번호]&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 char id[100][256];&lt;br /&gt;
 char password[100][256];&lt;br /&gt;
 char id_state[100];&lt;br /&gt;
 int id_num;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 char chat[100][BUFF_SIZE+5];&lt;br /&gt;
 char chat_s[100], chat_e;&lt;br /&gt;
 &lt;br /&gt;
 int stcmp(char* a,char *b)&lt;br /&gt;
 {&lt;br /&gt;
 	int i;&lt;br /&gt;
 	for(i=0; a[i]&amp;amp;amp;&amp;amp;amp;b[i] ;i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(a[i]!=b[i])&lt;br /&gt;
 			return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int send_i(int client_socket,char* arry)//명령어 전송&lt;br /&gt;
 {&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;i %s\n&amp;quot;,arry);&lt;br /&gt;
 	send(client_socket, buff_snd, strlen(buff_snd)+1,0);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int send_m(int client_socket,char arry[])//메세지 전송&lt;br /&gt;
 {&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;m %s\n&amp;quot;,arry);&lt;br /&gt;
 	send(client_socket, buff_snd, strlen(buff_snd)+1,0);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int login(int t_num)&lt;br /&gt;
 {&lt;br /&gt;
 	int i;&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5];&lt;br /&gt;
 &lt;br /&gt;
 	int client_socket;&lt;br /&gt;
 	client_socket=client_socket_array[t_num-1];&lt;br /&gt;
 &lt;br /&gt;
 	printf(&amp;quot;%dth clinet try to login\n&amp;quot;,t_num);&lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		send_i(client_socket,&amp;quot;i&amp;quot;);&lt;br /&gt;
 		if(recv(client_socket, buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 			return DISCONNECT;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		for(i=0;i&amp;amp;lt;id_num;i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(!stcmp(id[i],buff_rcv))&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		if(i==id_num)&lt;br /&gt;
 		{&lt;br /&gt;
 			send_m(client_socket,&amp;quot;ID is wrong&amp;quot;);&lt;br /&gt;
 			while(1)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 					return DISCONNECT;&lt;br /&gt;
 				if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 					break;&lt;br /&gt;
 			}&lt;br /&gt;
 			continue;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			if(id_state[i])&lt;br /&gt;
 			{&lt;br /&gt;
 				send_m(client_socket,&amp;quot;ID is being used.&amp;quot;);&lt;br /&gt;
 				while(1)&lt;br /&gt;
 				{&lt;br /&gt;
 					if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 						return DISCONNECT;&lt;br /&gt;
 					if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 						break;&lt;br /&gt;
 				}&lt;br /&gt;
 				continue;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		send_i(client_socket,&amp;quot;p&amp;quot;);//password 요구&lt;br /&gt;
 		if(recv(client_socket, buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 			return DISCONNECT;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		if(stcmp(password[i],buff_rcv))&lt;br /&gt;
 		{&lt;br /&gt;
 			send_m(client_socket, &amp;quot;password is wrong&amp;quot;);&lt;br /&gt;
 			while(1)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 					return DISCONNECT;&lt;br /&gt;
 				if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 					break;&lt;br /&gt;
 			}&lt;br /&gt;
 			continue;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		send_i(client_socket,&amp;quot;a&amp;quot;);//접속 확인&lt;br /&gt;
 &lt;br /&gt;
 		return i;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int new_ID(int t_num)&lt;br /&gt;
 {&lt;br /&gt;
 	int i;&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5];&lt;br /&gt;
 &lt;br /&gt;
 	int client_socket;&lt;br /&gt;
 	client_socket=client_socket_array[t_num-1];&lt;br /&gt;
 &lt;br /&gt;
 	printf(&amp;quot;%dth clinet try to create ID\n&amp;quot;,t_num);&lt;br /&gt;
 &lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		send_i(client_socket,&amp;quot;i&amp;quot;);&lt;br /&gt;
 		if(recv(client_socket, buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 			return DISCONNECT;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		for(i=0;i&amp;amp;lt;id_num;i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(!stcmp(id[i],buff_rcv))&lt;br /&gt;
 				break;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		if(i==id_num)&lt;br /&gt;
 		{&lt;br /&gt;
 			sprintf(id[id_num],&amp;quot;%s&amp;quot;,buff_rcv);&lt;br /&gt;
 			id_num++;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			send_m(client_socket,&amp;quot;ID is already existing..&amp;quot;);&lt;br /&gt;
 			while(1)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 					return DISCONNECT;&lt;br /&gt;
 				if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 					break;&lt;br /&gt;
 			}&lt;br /&gt;
 			continue;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 		send_i(client_socket,&amp;quot;p&amp;quot;);//password 요구&lt;br /&gt;
 		if(recv(client_socket, buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 			return DISCONNECT;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		sprintf(password[i],&amp;quot;%s&amp;quot;,buff_rcv);&lt;br /&gt;
 &lt;br /&gt;
 		send_i(client_socket,&amp;quot;a&amp;quot;);//접속 확인&lt;br /&gt;
 &lt;br /&gt;
 		return i;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void command(int t_num, char buff_rcv[])&lt;br /&gt;
 {&lt;br /&gt;
 	int i,j,k;&lt;br /&gt;
 	char temp_buff[BUFF_SIZE+1];&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+1];&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(temp_buff,&amp;quot;./help\n&amp;quot;);&lt;br /&gt;
 	if(!stcmp(temp_buff,buff_rcv))&lt;br /&gt;
 	{&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;&amp;amp;lt;Command list&amp;amp;gt;&amp;quot;);&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;help : show list of command&amp;quot;);&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;list : show list of online user&amp;quot;);&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;message \&amp;quot;ID\&amp;quot; \&amp;quot;message\&amp;quot; : send message to ID&amp;quot;);&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;\n&amp;quot;);&lt;br /&gt;
 		return;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	sprintf(temp_buff,&amp;quot;./list\n&amp;quot;);&lt;br /&gt;
 	if(!stcmp(temp_buff,buff_rcv))&lt;br /&gt;
 	{&lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;&amp;amp;lt;Online user list&amp;amp;gt;&amp;quot;);&lt;br /&gt;
 		for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 			if(thread_num[i] &amp;amp;amp;&amp;amp;amp; thread_id[i]&amp;amp;gt;=0)&lt;br /&gt;
 			{&lt;br /&gt;
 				send_m(client_socket_array[t_num-1],id[thread_id[i]]);&lt;br /&gt;
 			}&lt;br /&gt;
 &lt;br /&gt;
 		send_m(client_socket_array[t_num-1],&amp;quot;\n&amp;quot;);&lt;br /&gt;
 		return;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	sprintf(temp_buff,&amp;quot;./message &amp;quot;);&lt;br /&gt;
 	for(i=0;i&amp;amp;lt;10;i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(temp_buff[i]!=buff_rcv[i])&lt;br /&gt;
 			break;&lt;br /&gt;
 	}&lt;br /&gt;
 	if(i==10)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(i=0;i&amp;amp;lt;id_num;i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			for(j=0;buff_rcv[j+10]!=&amp;#039; &amp;#039;;j++)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(id[i][j]!=buff_rcv[j+10])&lt;br /&gt;
 					break;&lt;br /&gt;
 			}&lt;br /&gt;
 			if(buff_rcv[j+10]==&amp;#039; &amp;#039;)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(id_state[i])&lt;br /&gt;
 				{&lt;br /&gt;
 					sprintf(temp_buff,&amp;quot;send to %s : %s&amp;quot;, id[i], &amp;amp;amp;buff_rcv[j+11] );&lt;br /&gt;
 					send_m(client_socket_array[t_num-1],temp_buff);&lt;br /&gt;
 &lt;br /&gt;
 					for(k=0;k&amp;amp;lt;20;k++)&lt;br /&gt;
 						if(thread_id[k]==i)&lt;br /&gt;
 						{&lt;br /&gt;
 							sprintf(temp_buff,&amp;quot;message from %s : %s&amp;quot;,&lt;br /&gt;
 								id[thread_num[t_num-1]],&amp;amp;amp;buff_rcv[j+11]);&lt;br /&gt;
 							send_m(client_socket_array[k],temp_buff);&lt;br /&gt;
 							break;&lt;br /&gt;
 						}&lt;br /&gt;
 					break;&lt;br /&gt;
 				}&lt;br /&gt;
 				else&lt;br /&gt;
 				{&lt;br /&gt;
 					send_m(client_socket_array[t_num-1],&amp;quot;ID is offline&amp;quot;);&lt;br /&gt;
 					break;&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		if(i==id_num)&lt;br /&gt;
 			send_m(client_socket_array[t_num-1],&amp;quot;ID is wrong&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void message(int t_num, char buff_rcv[])&lt;br /&gt;
 {&lt;br /&gt;
 	int i;&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+1];&lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;%s : %s&amp;quot;,id[thread_id[t_num-1]],buff_rcv);&lt;br /&gt;
 &lt;br /&gt;
 	for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(thread_num[i] &amp;amp;amp;&amp;amp;amp; thread_id[i]&amp;amp;gt;=0)&lt;br /&gt;
 			send_m(client_socket_array[i],buff_snd);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	sprintf(chat[chat_e],&amp;quot;%s&amp;quot;,buff_snd);&lt;br /&gt;
 &lt;br /&gt;
 	chat_e++;&lt;br /&gt;
 	chat_e%=100;&lt;br /&gt;
 &lt;br /&gt;
 	for(i=0;i&amp;amp;lt;100;i++)&lt;br /&gt;
 		if(id_state[i] || i&amp;amp;gt;=id_num)&lt;br /&gt;
 			chat_s[i]=chat_e;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void disconnect(int t_num, int i_num)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;%dth client is disconnected\n&amp;quot;,t_num);&lt;br /&gt;
 	id_state[i_num]=0;&lt;br /&gt;
 	thread_num[t_num-1]=0;&lt;br /&gt;
 	close(client_socket_array[t_num-1]);&lt;br /&gt;
 	client_socket_array[t_num-1]=0;&lt;br /&gt;
 	thread_id[t_num-1]=0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void* rutine(void* data)//data = &amp;amp;amp;thread_num[스레드 번호]&lt;br /&gt;
 {&lt;br /&gt;
 	int t_num,i_num;//스레드 번호, 아이디 번호&lt;br /&gt;
 	int client_socket;&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5],buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 	int rcv;&lt;br /&gt;
 	int i,j;&lt;br /&gt;
 &lt;br /&gt;
 	t_num=*((int*)data);&lt;br /&gt;
 	//사용자가 이해하기 쉽도록 스레드 번호에 +1 값을 쓰도록 한다.&lt;br /&gt;
 &lt;br /&gt;
 	client_socket=client_socket_array[t_num-1];&lt;br /&gt;
 	//코드의 간결화를 위해 값을 복사한다.&lt;br /&gt;
 &lt;br /&gt;
 	printf(&amp;quot;%dth client is connected, socket_num is %d\n&amp;quot;,t_num, client_socket);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	thread_id[t_num-1]=-1;&lt;br /&gt;
 &lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 				disconnect(t_num,i_num);&lt;br /&gt;
 				return;&lt;br /&gt;
 		}&lt;br /&gt;
 		if(buff_rcv[0] == &amp;#039;l&amp;#039;)&lt;br /&gt;
 		{&lt;br /&gt;
 			send_i(client_socket,&amp;quot;a&amp;quot;);&lt;br /&gt;
 			while(1)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 				{&lt;br /&gt;
 						disconnect(t_num,i_num);&lt;br /&gt;
 						return;&lt;br /&gt;
 				}&lt;br /&gt;
 				else&lt;br /&gt;
 				{&lt;br /&gt;
 					if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 						break;&lt;br /&gt;
 				}&lt;br /&gt;
 			}&lt;br /&gt;
 			i_num=login(t_num);&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			if(buff_rcv[0] == &amp;#039;n&amp;#039;)&lt;br /&gt;
 			{&lt;br /&gt;
 				send_i(client_socket,&amp;quot;a&amp;quot;);&lt;br /&gt;
 				while(1)&lt;br /&gt;
 				{&lt;br /&gt;
 					if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 					{&lt;br /&gt;
 							disconnect(t_num,i_num);&lt;br /&gt;
 							return;&lt;br /&gt;
 					}&lt;br /&gt;
 					else&lt;br /&gt;
 					{&lt;br /&gt;
 						if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 							break;&lt;br /&gt;
 					}&lt;br /&gt;
 				}&lt;br /&gt;
 				i_num=new_ID(t_num);&lt;br /&gt;
 				break;&lt;br /&gt;
 			}&lt;br /&gt;
 			else&lt;br /&gt;
 			{&lt;br /&gt;
 				send_i(client_socket,&amp;quot;c&amp;quot;);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	if(i_num==DISCONNECT)&lt;br /&gt;
 	{&lt;br /&gt;
 		disconnect(t_num,i_num);&lt;br /&gt;
 		return;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	thread_id[t_num-1]=i_num;&lt;br /&gt;
 	id_state[i_num]=1;&lt;br /&gt;
 &lt;br /&gt;
 	//로그인 도중 메세지가 전송되는 것을 방지, 클라이언트가 작업을 완료하는 것을 기다린다.&lt;br /&gt;
 	while(recv(client_socket,buff_rcv,BUFF_SIZE,0))&lt;br /&gt;
 	{&lt;br /&gt;
 		if(buff_rcv[0]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 			break;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;log\n&amp;quot;);&lt;br /&gt;
 	send_m(client_socket,buff_snd);&lt;br /&gt;
 	for(;chat_s[i_num]!=chat_e;chat_s[i_num]++)&lt;br /&gt;
 	{&lt;br /&gt;
 		sprintf(buff_snd,&amp;quot;%s\n&amp;quot;,chat[chat_s[i_num]]);&lt;br /&gt;
 		send_m(client_socket, buff_snd);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;%s has joined&amp;quot;,id[i_num]);&lt;br /&gt;
 	for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(thread_num[i] &amp;amp;amp;&amp;amp;amp; thread_id[i]&amp;amp;gt;=0)&lt;br /&gt;
 			send_m(client_socket_array[i],buff_snd);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		rcv=recv(client_socket,buff_rcv,BUFF_SIZE,0);&lt;br /&gt;
 		if(rcv&amp;amp;gt;0)&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;received\n&amp;quot;);&lt;br /&gt;
 			if(buff_rcv[0]==&amp;#039;.&amp;#039; &amp;amp;amp;&amp;amp;amp; buff_rcv[1]==&amp;#039;/&amp;#039;)&lt;br /&gt;
 				command(t_num,buff_rcv);&lt;br /&gt;
 			else&lt;br /&gt;
 				message(t_num,buff_rcv);&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;%s has left&amp;quot;,id[i_num]);&lt;br /&gt;
 	for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(thread_num[i])&lt;br /&gt;
 			send_m(client_socket_array[i],buff_snd);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	disconnect(t_num, i_num);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	int server_socket;&lt;br /&gt;
 	int client_socket;&lt;br /&gt;
 	pthread_t p_thread[25];&lt;br /&gt;
 	struct sockaddr_in server_addr;&lt;br /&gt;
 	struct sockaddr_in client_addr;&lt;br /&gt;
 	int client_addr_size;&lt;br /&gt;
 	int i;&lt;br /&gt;
 &lt;br /&gt;
 	server_socket=socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;
 	if(server_socket==-1)&lt;br /&gt;
 	{&lt;br /&gt;
 		printf(&amp;quot;socket error\n&amp;quot;);&lt;br /&gt;
 		exit(1);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	memset(&amp;amp;amp;server_addr,0,sizeof(server_addr));&lt;br /&gt;
 	server_addr.sin_family	=AF_INET;&lt;br /&gt;
 	server_addr.sin_port	=htons(4000);&lt;br /&gt;
 	server_addr.sin_addr.s_addr=htonl(INADDR_ANY);&lt;br /&gt;
 	if(-1==bind(server_socket,(struct sockaddr*)&amp;amp;amp;server_addr,sizeof(server_addr)))&lt;br /&gt;
 	{&lt;br /&gt;
 		printf(&amp;quot;bind error\n&amp;quot;);&lt;br /&gt;
 		exit(1);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	printf(&amp;quot;server started\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 		thread_num[i]=0;&lt;br /&gt;
 &lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(-1==listen(server_socket,5))&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;listen error\n&amp;quot;);&lt;br /&gt;
 			exit(1);&lt;br /&gt;
 		}&lt;br /&gt;
 		client_socket = accept(server_socket, (struct sockaddr*)&amp;amp;amp;client_addr,&amp;amp;amp;client_addr_size);&lt;br /&gt;
 &lt;br /&gt;
 		if(client_socket==-1)&lt;br /&gt;
 			continue;&lt;br /&gt;
 &lt;br /&gt;
 		for(i=0;i&amp;amp;lt;20;i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(!thread_num[i])&lt;br /&gt;
 			{&lt;br /&gt;
 				client_addr_size= sizeof(client_addr);&lt;br /&gt;
 				client_socket_array[i] = client_socket;&lt;br /&gt;
 				thread_num[i]=i+1;&lt;br /&gt;
 				memset(&amp;amp;amp;p_thread[i],0,sizeof(p_thread[i]));&lt;br /&gt;
 				pthread_create(&amp;amp;amp;p_thread[i],NULL,rutine,(void *)&amp;amp;amp;thread_num[i]);&lt;br /&gt;
 				break;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		if(i==20)&lt;br /&gt;
 			printf(&amp;quot;error : Too many clients connected\n&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 	close(server_socket);&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 클라이언트 ==&lt;br /&gt;
 #include&amp;amp;lt;stdio.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;stdlib.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;unistd.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;string.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;sys/types.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;sys/socket.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;arpa/inet.h&amp;amp;gt;&lt;br /&gt;
 #include&amp;amp;lt;pthread.h&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define BUFF_SIZE 1024&lt;br /&gt;
 void gotoxy(int x,int y)&lt;br /&gt;
 {&lt;br /&gt;
 	printf(&amp;quot;\033[%d;%df&amp;quot;,y,x);&lt;br /&gt;
 	//터미널 출력 위치 변경 함수, y값이 화면 길이보다 크면 화면 길이로 처리된다.(버그의 원인)&lt;br /&gt;
 	fflush(stdout);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int client_socket;&lt;br /&gt;
 int check;&lt;br /&gt;
 &lt;br /&gt;
 void* rcv_thread(void *data)&lt;br /&gt;
 {&lt;br /&gt;
 	int i;&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5];&lt;br /&gt;
 	int rcv;&lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		rcv=recv(client_socket, buff_rcv, BUFF_SIZE, 0);&lt;br /&gt;
 		if(rcv&amp;amp;gt;0)&lt;br /&gt;
 		{&lt;br /&gt;
 			while(check==1);&lt;br /&gt;
 			check=2;&lt;br /&gt;
 			for(i=0;i&amp;amp;lt;rcv;)&lt;br /&gt;
 			{&lt;br /&gt;
 				if(buff_rcv[i]==&amp;#039;m&amp;#039;)&lt;br /&gt;
 				{&lt;br /&gt;
 					i+=2;&lt;br /&gt;
 					gotoxy(0,100);//gotoxy의 특징을 이용하여 화면을 한칸 올린다.&lt;br /&gt;
 					printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 					gotoxy(0,14);&lt;br /&gt;
 					printf(&amp;quot;                                                       &amp;quot;);&lt;br /&gt;
 					gotoxy(0,14);&lt;br /&gt;
 					printf(&amp;quot;%s&amp;quot;,&amp;amp;amp;buff_rcv[i]);&lt;br /&gt;
 				}&lt;br /&gt;
 				if(buff_rcv[i]==&amp;#039;i&amp;#039;)&lt;br /&gt;
 				{&lt;br /&gt;
 				}&lt;br /&gt;
 				i+=strlen(&amp;amp;amp;buff_rcv[i])+1;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;disconnected\n&amp;quot;);&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 		gotoxy(0,15);&lt;br /&gt;
 		printf(&amp;quot;write message to send :                                          &amp;quot;);&lt;br /&gt;
 		gotoxy(25,15);&lt;br /&gt;
 		fflush(stdout);&lt;br /&gt;
 		check=0;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void* snd_thread(void *data)&lt;br /&gt;
 {&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 &lt;br /&gt;
 	fgets(buff_snd,BUFF_SIZE,stdin);//버퍼 청소&lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		while(check==2);&lt;br /&gt;
 		check=1;&lt;br /&gt;
 		gotoxy(0,15);&lt;br /&gt;
 		printf(&amp;quot;write message to send :                                          &amp;quot;);&lt;br /&gt;
 		gotoxy(25,15);&lt;br /&gt;
 		check=0;&lt;br /&gt;
 		fgets(buff_snd,BUFF_SIZE,stdin);&lt;br /&gt;
 		check=0;&lt;br /&gt;
 		if(send(client_socket, buff_snd, strlen(buff_snd)+1,0)&amp;amp;lt;=0)&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;disconnected\n&amp;quot;);&lt;br /&gt;
 			break;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int login(int client_socket)&lt;br /&gt;
 {&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5];&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 	//로그인 시스템&lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		printf(&amp;quot;new id=n / login=l : &amp;quot;);&lt;br /&gt;
 		fflush(stdout);&lt;br /&gt;
 &lt;br /&gt;
 		scanf(&amp;quot;%s&amp;quot;,buff_snd);&lt;br /&gt;
 		send(client_socket,buff_snd,strlen(buff_snd)+1,0);&lt;br /&gt;
 		while(1)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;lt;=0)&lt;br /&gt;
 			{&lt;br /&gt;
 				printf(&amp;quot;disconnected\n&amp;quot;);&lt;br /&gt;
 				close(client_socket);&lt;br /&gt;
 				return -1;&lt;br /&gt;
 			}&lt;br /&gt;
 			if(buff_rcv[0]==&amp;#039;i&amp;#039;)&lt;br /&gt;
 				break;&lt;br /&gt;
 			if(buff_rcv[0]==&amp;#039;m&amp;#039;)&lt;br /&gt;
 				printf(&amp;quot;%s&amp;quot;,&amp;amp;amp;buff_rcv[2]);&lt;br /&gt;
 		}&lt;br /&gt;
 		if(buff_rcv[2]==&amp;#039;a&amp;#039;)&lt;br /&gt;
 			break;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;a&amp;quot;);&lt;br /&gt;
 	send(client_socket,buff_snd,strlen(buff_snd)+1,0);&lt;br /&gt;
 &lt;br /&gt;
 	while(1)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(recv(client_socket,buff_rcv,BUFF_SIZE,0)&amp;amp;gt;0)&lt;br /&gt;
 		{&lt;br /&gt;
 			if(buff_rcv[0]==&amp;#039;i&amp;#039;)&lt;br /&gt;
 			{&lt;br /&gt;
 				switch(buff_rcv[2])&lt;br /&gt;
 				{&lt;br /&gt;
 					case &amp;#039;i&amp;#039; :&lt;br /&gt;
 						printf(&amp;quot;ID : &amp;quot;);&lt;br /&gt;
 						fflush(stdout);&lt;br /&gt;
 						scanf(&amp;quot;%s&amp;quot;,buff_snd);&lt;br /&gt;
 						send(client_socket,buff_snd,strlen(buff_snd)+1,0);&lt;br /&gt;
 						break;&lt;br /&gt;
 					case &amp;#039;p&amp;#039; :&lt;br /&gt;
 						printf(&amp;quot;PASSWORD : &amp;quot;);&lt;br /&gt;
 						fflush(stdout);&lt;br /&gt;
 						scanf(&amp;quot;%s&amp;quot;,buff_snd);					&lt;br /&gt;
 						send(client_socket,buff_snd,strlen(buff_snd)+1,0);&lt;br /&gt;
 						break;&lt;br /&gt;
 				}&lt;br /&gt;
 &lt;br /&gt;
 				if( buff_rcv[2] == &amp;#039;a&amp;#039; )&lt;br /&gt;
 					break;&lt;br /&gt;
 			}&lt;br /&gt;
 			if(buff_rcv[0]==&amp;#039;m&amp;#039;)&lt;br /&gt;
 			{&lt;br /&gt;
 				printf(&amp;quot;%s&amp;quot;,&amp;amp;amp;buff_rcv[2]);&lt;br /&gt;
 				sprintf(buff_snd,&amp;quot;a&amp;quot;);&lt;br /&gt;
 				send(client_socket, buff_snd, strlen(buff_snd)+1, 0);&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			printf(&amp;quot;disconnected\n&amp;quot;);&lt;br /&gt;
 			close(client_socket);&lt;br /&gt;
 			return -1;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	struct sockaddr_in server_addr;&lt;br /&gt;
 	char buff_snd[BUFF_SIZE+5];&lt;br /&gt;
 	char buff_rcv[BUFF_SIZE+5];&lt;br /&gt;
 	int rcv;&lt;br /&gt;
 	int i;&lt;br /&gt;
 	pthread_t p_thread[2];&lt;br /&gt;
 &lt;br /&gt;
 	client_socket=socket(PF_INET, SOCK_STREAM, 0);&lt;br /&gt;
 &lt;br /&gt;
 	if(client_socket==-1)&lt;br /&gt;
 	{&lt;br /&gt;
 		printf(&amp;quot;socket error\n&amp;quot;);&lt;br /&gt;
 		return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 	memset( &amp;amp;amp;server_addr, 0, sizeof( server_addr));&lt;br /&gt;
 	server_addr.sin_family     = AF_INET;&lt;br /&gt;
 	server_addr.sin_port       = htons( 4000);&lt;br /&gt;
 	server_addr.sin_addr.s_addr= inet_addr( &amp;quot;127.0.0.1&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 	if(-1==connect(client_socket,(struct sockaddr*)&amp;amp;amp;server_addr, sizeof( server_addr) ) )&lt;br /&gt;
 	{&lt;br /&gt;
 		printf(&amp;quot;connect error\n&amp;quot;);&lt;br /&gt;
 		return 1;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	if(login(client_socket))&lt;br /&gt;
 		return 0;&lt;br /&gt;
 &lt;br /&gt;
 	sprintf(buff_snd,&amp;quot;a&amp;quot;);&lt;br /&gt;
 	send(client_socket,buff_snd,strlen(buff_snd)+1,0);//메세지 전송을 허용함.&lt;br /&gt;
 &lt;br /&gt;
 	memset(&amp;amp;amp;p_thread[0],0,sizeof(p_thread[0]));&lt;br /&gt;
 	pthread_create(&amp;amp;amp;p_thread[0],NULL,rcv_thread,(void *)NULL);&lt;br /&gt;
 &lt;br /&gt;
 	memset(&amp;amp;amp;p_thread[1],0,sizeof(p_thread[1]));&lt;br /&gt;
 	pthread_create(&amp;amp;amp;p_thread[1],NULL,snd_thread,(void *)NULL);&lt;br /&gt;
 &lt;br /&gt;
 	pthread_join(p_thread[0],(void**)&amp;amp;amp;rcv);&lt;br /&gt;
 	pthread_join(p_thread[1],(void**)&amp;amp;amp;rcv);&lt;br /&gt;
 &lt;br /&gt;
 	close(client_socket);&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== 설명 ==&lt;br /&gt;
=== 기능 ===&lt;br /&gt;
* 리눅스 멀티 채팅&lt;br /&gt;
* 계정 생성 및 비밀번호 생성&lt;br /&gt;
* 간단한 명령어 가능 (명령어 목록 보기, 접속 인원 보기, 귓속말)&lt;br /&gt;
=== 버그 ===&lt;br /&gt;
* 터미널 세로 크기가 20 이하일 경우 화면이 꼬임&lt;br /&gt;
* 메세지 작성 중, 다른 유저가 메세지를 보낼 시 작성 중이던 부분이 보이지 않음.&lt;br /&gt;
=== 기타 사항 ===&lt;br /&gt;
* 서버 주소가 127.0.0.1(loopback)로 설정되어있음.&lt;br /&gt;
----&lt;br /&gt;
[[김희성]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;hsebs</name></author>
	</entry>
</feed>