最近在linux网络编程所遇到的几个问题,这里备注一下,都是在网上找到的解决办法。
1. 服务器端接收来自客户端的信息,其中在连接时出现 accept: Invalid argument 错误。
在网上找到信息,说accept函数低最后一个参数sin_size 必须要为正数,因此在定义初始化sin_size 变量时先对其初始化为一个正整数。
socklen_t sin_size = 4;
if(-1 == (sockfd_client = accept(sockfd, (struct sockaddr*)&client_sockaddr,&sin_size)))
{
perror("accept");
goto error;
}
2. 在客户端与服务器端进行通信时,经常需要将服务器端进行强制关闭“ctrl+c”,而关闭后马上重新执行server程序是出现Bind error: Address already in use 错误。
原因是bind绑定套接字后,如果退出,TCP 套接字状态 TIME_WAIT
引起。该状态在套接字关闭后约保留 2 到4分钟。在 TIME_WAIT
状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
修改为在bind函数之前添加ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );函数,其中on设置为1,来避开TIME_WAIT,使端口可以马上重用。
此处参考 linux套接字中的5个隐患:http://www.ibm.com/developerworks/cn/linux/l-sockpit/