-1

こんにちは、ポート番号が使用可能かどうかを確認する簡単な方法があるかどうか疑問に思っています。事前に使用できるように予約しておくと思いますか? 以下のコードはまさにそれを行う際に機能しますが、複雑すぎるようです。

 int getSocketNo(){
socklen_t namelen;
struct sockaddr_in node;
int sock_1;

/* ----Address information for use with bind---- */
node.sin_family = AF_INET;         /* it is an IP address */
node.sin_port   = 0;
node.sin_addr.s_addr = INADDR_ANY; /* use any interface on this host*/

/* ----Create TCP/IP socket---- */
sock_1 = socket(AF_INET, SOCK_STREAM, 0);
if (sock_1 == -1) {
    perror("socket() Socket was not created");
    exit(-1);
}

while(1){
    /* ----Bind socket to address and port---- */
    if (bind(sock_1, (struct sockaddr *) &node, sizeof(node))) {
        perror("Server bind error");
        continue;
    }

    int y = 1; // not sure what this does yet
    setsockopt(sock_1, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(y));

    /* ----Find out what port number was assigned---- */
    namelen = sizeof(node);
    if (getsockname(sock_1, (struct sockaddr *) &node, &namelen)) {
        perror("Server get port number");
        exit(-1);
    }
    close(sock_1);
    break;
}

return ntohs(node.sin_port);

}

4

2 に答える 2

1

ポート番号の予約:

プログラム/アプリのポート番号を事前に予約することはできません。bind()あなたが望むことをします。ポート番号のバインドを呼び出したプロセスのポート番号を予約します。


ポート番号が利用可能かどうかの確認:

ポート番号が使用可能かどうかを確認する限り、答えはbind(). If the port number is not available, bind will fail. これは、ポートが他のプロセスによって使用されていることを意味します。新しいポート番号をバインドしてみてください

詳細については、 Linux Manを参照してください。


簡単なサンプル コード:

int main()
{
int sockFd, bytesRead = 1, bytesSent;

char buffer[MaxBufferLength];

struct sockaddr_in server, client;


server.sin_port= htons(PORT);
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);

sockFd = socket(AF_INET, SOCK_STREAM, 0);


if(sockFd < 0)
    printf("Unable to open socket\n");


int i = bind(sockFd, (struct sockaddr *)&server, sizeof(struct sockaddr));

if(i < 0)
    perror("Unable to bind\n");



i = listen(sockFd, 1);

if(i < 0)
    printf("Unable to listen\n");


int len = sizeof(struct sockaddr);

int connectionSocket = accept(sockFd, (struct sockaddr *) &client, &len);

if(connectionSocket < 0)
    perror("connection not established\n");


   // from this point onwards, send & receive data.
于 2013-10-15T07:01:09.620 に答える