0
私はLinuxでソケットプログラミングを学んでいますが、問題があります。CでのLinuxソケットプログラミング、サーバソケットが閉じられない
本当にシンプルなクライアントとサーバーのソケット接続をTCPソケットで設定しようとしています。しかし、サーバーを再起動すると、同じIPアドレスとポート番号にバインドできないため、サーバーソケットを閉じることができないと思います。
問題のデバッグ方法もわかりません。私はbind
のマニュアルページでエラーが発生したときにerrnoが設定されると読んでいます。私はそれを見る方法を知らない。errno
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char* argv[]) {
int serverSocket, clientSocket, portno;
socklen_t clientLength;
struct sockaddr_in serverAddress, clientAddress;
int n;
char buffer[256];
if (argc < 2) {
fprintf(stderr, "ERROR too few arguments.\n");
exit(-1);
}
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
fprintf(stderr, "ERROR creating socket!\n");
exit(1);
}
bzero((char*) &serverAddress, sizeof(serverAddress));
portno = atoi(argv[1]);
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(portno);
if (bind(serverSocket, (struct sockaddr*) &serverAddress, sizeof(serverAddress)) < 0) { //This bind will fail, after re-run.
fprintf(stderr, "ERROR binding socket\n");
exit(2);
}
listen(serverSocket, 5);
clientLength = sizeof(clientAddress);
clientSocket = accept(serverSocket, (struct sockaddr*) &clientSocket, &clientLength);
if (clientSocket < 0) {
fprintf(stderr, "ERROR on accept\n");
exit(3);
}
bzero(buffer, 256);
n = read(clientSocket, buffer, 256);
char* ack = "I got your message";
fprintf(stdout, "Here is the message %s\n", buffer);
n = write(clientSocket, ack, strlen(ack));
close(clientSocket);
close(serverSocket);
return 0;
}
は、私の知る限り理解し、ファイルディスクリプタであるソケットは、すぐに閉じて取得することはできません。
は、ここに私のすべてのコードです。したがって、プログラムが終了して30秒以内に再度実行されると、アドレスにバインドできません。しかし、私が待っていれば、分のように、それはアドレスに束縛することに問題はありません。
この問題の原因を教えてください。
あなたはhttps://stackoverflow.com/a/15199016/1034749を読んでいますか? – fghj
はい、私は今それをチェックしました。それが私の考えです。 – Bora