현재 컴퓨터에서 통신에 사용할수 있는 포트번호를 알고 싶습니다.

yoowon904의 이미지

안녕하세요.

현재 컴퓨터에서 사용중이지 않은 포트번호를 알고 싶습니다.

안드로이드에서 소켓통신을 하는데, 소켓통신을 할 경우에 제가 특정 포트번호를 4251 포트를

통해서 소켓통신을 하는데.. 다른 번호로 바꾸면 제데로 작동이 되질 않더군요 ..

어떤분의 조언을듣고 cmd창에 옆에 명령어를 쳐보았더니 netstat -an | find "LISTEN"

아래의 사진과 같이 나오더군요 .. 그런데 이 부분만으로는 뭘 어떻게 하라는건지 잘 모르겠습니다.

여하튼.. 안드로이드와 아두이노 사이에 소켓통신을 하기 위해서 아래와 같이 4251을 주면, 잘

전송이 되는데.. 다른 포트번호를 주면 안되는 이유는 무엇인가요... ?

그리고, 4251 번호 말고도 사용할수 있는 번호를 어떻게 알 수 있을까요 ㅠ

도움이 필요합니다..

 public void run() {
      try {
         Log.i("socket", "attemping connect");
         socket=new Socket(ip,4251);        //입력한 아이피, 4251포트로 접속을 시도한다.
         Log.i("socket","connect success");  //성공했으면 connect success를 로그로 출력한다.
 
    }

File attachments: 
첨부파일 크기
Image icon asfasfafs.PNG28.24 KB
 의 이미지

굉장히 특이한 서비스를 제공하고 있는 서버가 아닌 한, 아래 리스트에 없는 포트는 웬만하면 사용가능합니다.

https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

이 리스트는 상당히 빽빽한 편인데 대충 살펴보면 아시겠지만 "과연 내가 향후 10년간 이 데몬을 실행시켜 볼 일이 있을까" 싶은 것들이 많죠.
사실 임의의 네 자리 TCP 포트 번호를 사용할 때 운수 더럽게도 이미 사용중일 가능성은 거의 없습니다. 그래도 불안하면 다섯 자리로 가면 되고요.

그건 그렇고, 제공해주신 코드는 클라이언트 쪽인 듯 한데, 포트 바꾸면서 서버 프로그램 쪽 포트 번호도 똑같이 바꿔주신 거 맞죠?

dlsxjsptvmfhxhzhf의 이미지


답변 감사드립니다.

제가 만든 프로그램이, 안드로이드에서 버튼부분에 이벤트를 줌으로써 아두이노와 통신하기 위해
소켓을 열고, 아두이노 쪽으로 1바이트의 버퍼를 보내고 아두이노쪽에서는 안드로이드에서 송신한 버퍼를 받아, 동작하는 방식입니다.

처음에 소켓을 여는 부분은, 아래의 소스에서 보시면 안드로이드 에서 소켓을 엽니다.
그리고 데이터 입출력 스트림을 생성하고 아두이노 쪽으로 데이터를 보내는 것을 보실 수 있으십니다.

그리고 그 아래쪽에서는 아두이노 관련되서 똑같이 포트번호 4251을 쓰시는것을 보실수 있습니다.

그런데 아래의 안드로이드 소스와 아두이노 부분에서 4251 포트 말고도, 다른 임의의 0~65536까지의

숫자중 5개나 아무거나 입력해보았는데.. 거의 대다수가 연결이 되지 않았습니다..

그래서,4251 이외에 사용할수 있는 포트번호를 어디서 찾아봐야 할지 고민입니다.

그리고, 통신번호 4251은 서버와 클라이언트간의 약속 처럼 규정된 번호라고 알고 있는데,
안드로이드에서 소켓을 생성했으니 안드로이드쪽이 서버가 되고 아두이노쪽에서 데이터를 수신하니까
아두이노 쪽을 클라이언트라고 하는것이 맞는지 궁금합니다.

###################################### 안드로이드 소스 ###############################
@Override
public void run() {
try {

socket=new Socket(ip,4251); //입력한 아이피, 4251포트로 접속을 시도한다.

dataInputStream=new DataInputStream(socket.getInputStream());
dataOutputStream=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
Log.i("Input Error", "connect | dataInput | dataOutput error");
Toast.makeText(MainActivity.this, "IP가 맞지 않습니다.", Toast.LENGTH_SHORT).show();
}

while(true)
{
if(threadStopFlag) //만약 threadStopFlag가 true가 되서 스레드를 멈추라는 명령이 들어오면
{
try {
dataOutputStream.close(); //출력스트림을 종료한다.
Log.i("dataOutputStrema","dataoutputstream close");
dataInputStream.close(); //입력스트림도 종료한다.
Log.i("datainputStrema", "datainputstream close");
socket.close();
Log.i("socket", "socket close");
} catch (IOException e)
{
e.printStackTrace();
}
break;
}

switch(rwFlag)
{
case TRANSFER: //전송버튼을 누르면
buffer[0]='t'; //버퍼에 t를 집어넣고.
try {
dataOutputStream.write(buffer); //아두이노 쪽으로 쏜다.
Log.i("write", "t");
} catch (IOException e) {
e.printStackTrace();
}
break;
}

setWait();
}
}

####################### 아두이노 소스 ##############################################

#include
#include
#include "utility/debug.h"
#include "utility/socket.h"

#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin!
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10

Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT,
SPI_CLOCK_DIVIDER); // Wifi 모듈 셋팅

#define WLAN_SSID "124AZF296E5" // 공유기 이름
#define WLAN_PASS "AQWF323325" // 공유기 암호

#define WLAN_SECURITY WLAN_SEC_WPA2

#define LISTEN_PORT 4251 // 포트 4251 사용 - 아두이노앱에서 4251 포트로 전송함

Adafruit_CC3000_Server testServer(LISTEN_PORT); // Wifi 모듈 클래스 생성 포트 4251

void setup(void)
{
pinMode(2, OUTPUT); // 제어 핀 설정 2번
digitalWrite(2, HIGH); // 제어 핀 초기값 HIGH

Serial.begin(115200); // 시리얼 통신 속도 셋팅

// 모듈 초기화
Serial.println(F("\nInitializing..."));
if (!cc3000.begin())
{
Serial.println(F("Couldn't Initializing"));
while(1);
}

Serial.print(F("connect to "));
Serial.println(WLAN_SSID); // 접속할 공유기 이름 출력
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { // 공유기 접속
Serial.println(F("Failed!")); // 공유기 접속 안되면 실패 출력
while(1);
}

Serial.println(F("Connected!"));

Serial.println(F("Request DHCP"));
while (!cc3000.checkDHCP())
{
delay(100);
}

// 공유기에 접속된 IP 출력
while (! displayConnectionIp()) {
delay(1000);
}

// 서버 동작 시작
testServer.begin();


}

void loop(void)
{
Adafruit_CC3000_ClientRef client = testServer.available(); // 서버 대기 상태
if (client) { // client 접속이 있으면
if (client.available() > 0) { // 읽어올 데이터가 있는지 확인
uint8_t ch = client.read(); // byte로 데이터 읽음
//client.write(ch); // 클라이언트로 데이터 전송
if(ch == 't') { // 클라이언트에서 't' 가 입력되면
Serial.println(F("Door Open/Close"));
digitalWrite(2, HIGH); // 2번 포트 출력 HIGH 에서
delay(100); // 휴식( 안정화 )
digitalWrite(2, LOW); // 2번 포트 출력 LOW - 도어락 동작!
delay(100); // 휴식( 안정화 )
digitalWrite(2, HIGH); // 도어락 쪽에서도 수동동작 될 수 있도록 하기 위함
delay(100); // 휴식( 안정화 )
}
}
}
}

bool displayConnectionIp(void)
{
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;

if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
{
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
return false;
}
else
{
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
Serial.println();
return true;
}
}

 의 이미지

데이터를 누가 주고 누가 받는지는 중요한 게 아닙니다.
누가 listen하고 누가 connect하는지가 중요한 거죠.
물론 사실 이런 구분은 일단 접속이 이루어지고 통신이 시작되면 더 이상 중요해지지 않긴 합니다.
제공된 코드에서는 죄다 캡슐화되어 있어서 확신은 못하겠습니다만 아두이노 쪽이 서버인 듯 하군요.

아무튼, 양쪽의 소스 모두에서 4251를 다른 숫자로 바꾸었는데 안 동작한다면, 뭔가 제가 보고 있는 범위 밖의 문제라는 생각이 듭니다.

이런 문제를 진단할 때 쓰는 도구들이 몇몇 있습니다만(netstat도 그 중 하나입니다) 제가 직접 그 상황에 있는 게 아니라서 뭐라 말씀드리기가 참 어렵네요.

dlsxjsptvmfhxhzhf의 이미지

답변 감사드립니다. 말씀해주신 답변을 여러번 읽어보고, 궁금증이 해결되지 않는 부분이 있어서 글을 남겨봅니다. 양쪽 모두 4251로 바꾸었고 동작을 잘 합니다. 위에 글을 쓴것과 같이 안드로이드 쪽에서 소켓을 열고, 아두이노 쪽으로 버퍼를 보내는데 아두이노쪽이 서버의 부분이 되는건가요?

소스를 올려서 한번 확인을 받고싶네요 ㅠ 이러한 질문이 그 어느곳에서도 답변이 달리지 않아서..
kldp에서 시스템 부분 관련해서 고수분들이 많아서 도움을 얻고싶네요..ㅠ

댓글 달기

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