Sockets 为什么我的套接字程序中会出现绑定错误?是因为我没有正确关闭插座吗?

Sockets 为什么我的套接字程序中会出现绑定错误?是因为我没有正确关闭插座吗?,sockets,posix,Sockets,Posix,我正在编写用于套接字通信的简单服务器和客户端程序。有时,我的服务器程序中会出现绑定错误,有时它会按预期工作 下面显示的是我的服务器代码 int Socket; struct sockaddr_in Server; Socket = socket(AF_INET, SOCK_STREAM, 0); if(Socket == -1){ printf("Socket error\n"); } Server.sin_addr.s_addr = inet_addr("127.0.0.1");

我正在编写用于套接字通信的简单服务器和客户端程序。有时,我的服务器程序中会出现绑定错误,有时它会按预期工作

下面显示的是我的服务器代码

int Socket;
struct sockaddr_in Server;

Socket = socket(AF_INET, SOCK_STREAM, 0);
if(Socket == -1){
    printf("Socket error\n");
}

Server.sin_addr.s_addr = inet_addr("127.0.0.1");
Server.sin_family = AF_INET;
Server.sin_port = htons(50000);

if(connect(Socket, (struct sockaddr *)&Server, sizeof(Server)) < 0){
    printf("Connection Error\n");       
    return 1;
}

char Buf[100];
while(1){
    memset(Buf, '\0', sizeof(Buf)); 
    if(recv(Socket, &Buf, 100, 0) < 0){
        printf("Error to receive\n");
        close(Socket);
        return 1;

    }

    if(!strncmp(Buf, "quit\n", 5))
        break;


}
close(Socket);

return 0;
int插座;
服务器中的结构sockaddr_;
Socket=Socket(AF_INET,SOCK_STREAM,0);
如果(套接字==-1){
printf(“套接字错误\n”);
}
Server.sin_addr.s_addr=inet_addr(“127.0.0.1”);
Server.sinu family=AF\u INET;
Server.sin_port=htons(50000);
if(connect(Socket,(struct sockaddr*)&Server,sizeof(Server))<0){
printf(“连接错误\n”);
返回1;
}
char-Buf[100];
而(1){
memset(Buf,'\0',sizeof(Buf));
如果(recv(插座和Buf,100,0)<0){
printf(“接收错误\n”);
关闭(插座);
返回1;
}
如果(!strncmp(Buf,“退出”,5))
打破
}
关闭(插座);
返回0;
和我的服务器代码:

int Socket;
struct sockaddr_in server_address, myClient;

Socket = socket(AF_INET, SOCK_STREAM, 0);

if(Socket == -1){
    printf("Socket Erro\n");
    return 1;
}

memset(&server_address, '0', sizeof(server_address));
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_family = AF_INET;
server_address.sin_port = htons(50000);


if(bind(Socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0){

    printf("bind error\n");
    return 1;
}

listen(Socket, 10); 
int nSocket;

nSocket = accept(Socket, (struct sockaddr*)NULL, NULL);

if(nSocket < 0){
    perror("Accept Failed");
    return 1;

}

char Buf[100];
while(1){
    memset(Buf, '\0', sizeof(Buf));
    fgets(&Buf[0], 100, stdin); 

    int temp = strchr(Buf, '\n') - Buf;
    write(nSocket, Buf, temp+1);        

    if(!strcmp(Buf, "quit\n"))
        break;

}
close(Socket);

return 0;
int插座;
服务器地址myClient中的结构sockaddr_;
Socket=Socket(AF_INET,SOCK_STREAM,0);
如果(套接字==-1){
printf(“套接字错误”);
返回1;
}
memset(&server_地址,'0',sizeof(server_地址));
服务器地址sin\u addr.s\u addr=htonl(INADDR\u ANY);
服务器地址.sin\u family=AF\u INET;
服务器地址sin端口=htons(50000);
if(绑定(套接字,(结构sockaddr*)和服务器地址,sizeof(服务器地址))<0{
printf(“绑定错误\n”);
返回1;
}
听(插座,10);
int nSocket;
nSocket=accept(Socket,(struct sockaddr*)NULL,NULL);
如果(nSocket<0){
perror(“接受失败”);
返回1;
}
char-Buf[100];
而(1){
memset(Buf,'\0',sizeof(Buf));
fgets(和Buf[0],100,标准差);
int temp=strchr(Buf,'\n')-Buf;
写入(nSocket、Buf、temp+1);
如果(!strcmp(Buf,“quit\n”))
打破
}
关闭(插座);
返回0;

有时在运行服务器时,会出现绑定错误,有时则不会。这通常发生在我退出服务器并重新启动它时。可能是因为我没有正确关闭插座吗?可能是因为我正在从两侧关闭插座吗?

我修复了错误。问题是,我试图在退出服务器后直接再次运行它。这导致再次绑定套接字时出现问题,因为操作系统会在套接字关闭后的短时间内使其不可用

之后:

Socket = socket(AF_INET, SOCK_STREAM, 0);

int enable = 1;
if (setsockopt(Socket, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof(int)) < 0)
    error("setsockopt(SO_REUSEADDR) failed");
int enable=1;
if(setsockopt(Socket,SOL_Socket,SO_REUSEADDR,&(int){1},sizeof(int))<0)
错误(“setsockopt(SO_REUSEADDR)失败”);

我还修复了@EJP指出的许多错误处理,这些错误并没有直接导致我的问题。

@EJP有一个终止机制-如果您键入“退出”。谢谢,我解决了您指出的问题,但它仍然没有回答我关于绑定错误的问题。我从来没有得到一个接收或接受错误标记的EJP的评论被删除。这里没有居高临下的评论的地方。特别是当这个人显然没有检查你的全部代码时。感谢你指出操作系统让套接字在短时间内保持忙碌。这完全救了我一天。添加一个sleep语句是修复我已经盯着看了一个小时的错误所需要的全部。