C 如何防止程序崩溃时网络端口保持打开状态

C 如何防止程序崩溃时网络端口保持打开状态,c,network-programming,crash,ports,C,Network Programming,Crash,Ports,上学期我参加了计算机网络课程,并为我的项目用linux(使用gcc)进行了一些C编程。我不断遇到的一件极其乏味的事情是,如果我的程序崩溃或暂停(然后我必须按Ctrl+C键才能终止它),网络端口仍会保持打开状态一分钟左右。因此,如果我想立即再次运行该程序,我必须首先进入头文件,更改端口,重新生成程序,然后最终运行它。显然,这很快就会变得非常乏味 有没有办法将其配置为在进程终止后立即释放端口?或者通过linux中的某些设置,或者在我的程序的makefile中,或者甚至通过C编程 编辑:我指的是在编写

上学期我参加了计算机网络课程,并为我的项目用linux(使用gcc)进行了一些C编程。我不断遇到的一件极其乏味的事情是,如果我的程序崩溃或暂停(然后我必须按Ctrl+C键才能终止它),网络端口仍会保持打开状态一分钟左右。因此,如果我想立即再次运行该程序,我必须首先进入头文件,更改端口,重新生成程序,然后最终运行它。显然,这很快就会变得非常乏味

有没有办法将其配置为在进程终止后立即释放端口?或者通过linux中的某些设置,或者在我的程序的makefile中,或者甚至通过C编程


编辑:我指的是在编写服务器并选择特定端口来承载程序时。

在套接字上设置选项
,以便重新使用EADDR

int yes = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

从。

我假设您正在编写的程序是一个服务器,因此您需要使用一个已知的端口。如果是这种情况,您应该像Cogsy指出的那样在套接字上使用SO_REUSE_ADDR选项


另一方面,如果您正在编写客户端软件,则应避免选择特定端口,从而允许系统为您提供随机端口。

我打赌大约需要两分钟:) 正如@Cogsy所指出的那样,
SO\u REUSEADDR
socket选项是您的朋友。 让自己熟悉TCP状态,是
TIME\u WAIT
状态导致您出现问题:


通过选择一个随机端口,并在执行时将其打印出来,您可以避开这个问题。@Tordek,这是一个很好的观点,但我要在这里向子孙后代指出,如果您这样做,您必须从安全范围中进行选择,以确保您不会偶然发现任何标准端口,是的。。。不小心躲开会让你踩到狗屎……这是个好主意。另一种选择是,编写程序代码以接受端口号作为输入,以避免重新编译。要真正释放您想要的端口,您需要编写一个Ctrl-C处理程序并在那里编写close代码。(无关)有人想让第四个参数成为指向int而不是int的指针吗?没错,上面的解决方案实际上并没有释放套接字,但它允许在下一次执行时将其重新绑定。@Kai:(准备就绪)sockopt支持各种套接字上的各种选项。第二个和第三个参数的某些值导致第四个参数被视为指向结构或字符串的指针。如果它不从技术上释放套接字,只要端口可以重用就可以了,因为这仍然解决了我的问题。谢谢!啊,我会非常高兴的用RFC 793第23页的惊人ASCII图表的副本代替。哦,是的!我完全忘记了ASCII图片的美妙艺术:)