一:本地通信:unix domain socket 与网络socket编程最大的不同在于地址格式不同,用结构体socketaddr_un表示,网络地址是由ip加端口号决定,而domain socket的地址是一个socket类型的文件在文件系统的路径,该文件由bind()函数创建并绑定,如果bind时该文件已经存在,则绑定失败。因此每次把创建的socket文件删除或者bind一个新的socket文件。
二:网络通信:程序第一次可以正确运行并且结束,但第二次开始就会出现错误bind:Address already in use,只能用ctrl+c强制结束,这个问题是由TCP 套接字状态TIME_WAIT 引起,在套接字通过close()正常关闭后,会保留2到4分钟,该套接字才会删除,同时与该套接字绑定的端口和本地地址才可以被重新绑定。所以如果我们运行过一次程序,用close(sockfd)删除这个套接字之后,其实要等到几分钟之后,才会真正删除,这段时间内的端口和本地地址是仍然与该套接字绑定的,如果你立即再执行一遍程序,便会提示:这个地址正在使用中。
有一个绕过TIME_WAIT的方法就是,给套接字设置一下,让它可以绑定一个复用的端口就可以了。具体是利用setsockopt函数。
intsets