网络编程--出现bind error: Address already in use问题

发生这种情况是在服务端主动关闭连接以后,接着立即启动就会出现这种错误。显示如下
在这里插入图片描述
解决端口复用的问题:bind error: Address already in use,需要用到setsockopt函数
i n t s e t s o c k o p t ( i n t s o c k f d , i n t l e v e l , i n t o p t n a m e , c o n s t v o i d ∗ o p t v a l , s o c k l e n t o p t l e n ) ; int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); intsetsockopt(intsockfd,intlevel,intoptname,constvoidoptval,socklentoptlen);
setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt, sizeof(int));
setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,&opt, sizeof(int));
这两个函数都可以。
由于错误是bind函数报出来的,该函数调用要放在bind之前,socket之后调用。代码如下:

//多进程版本的高并发服务器
#include
#include
#include
#include
#include
#include
#include
#include
#include "wrap.h"
int main(){//创建socketint lfd=Socket(AF_INET,SOCK_STREAM,0);//设置端口复用int opt=1;setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(int));//绑定struct sockaddr_in serv;bzero(&serv,sizeof(serv));serv.sin_family=AF_INET;serv.sin_port=htons(8888);serv.sin_addr.s_addr=htonl(INADDR_ANY);Bind(lfd,(struct sockaddr *)&serv,sizeof(serv));//设置监听Listen(lfd,128);struct sockaddr_in client;int cfd;pid_t pid;socklen_t len;char sIP[16];while(1){//接受新的链接len=sizeof(client);memset(sIP,0x00,sizeof(sIP));cfd=Accept(lfd,(struct sockaddr *)&client,&len);//接受一个新的连接,创建一个子进程,让子进程完成数据的手法操作pid=fork();if(pid<0){perror("fork error");}else if(pid>0){//关闭通信文件描述符cfdclose(cfd);}else if(pid==0){//关闭监听文件描述符close(lfd);int n;char buf[1024];int i;while(1){//读数据;n=Read(cfd,buf,sizeof(buf));if(n<=0){printf("read error or client closed, n=%d\n",n);break;}printf("client=%s,port=%d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,sIP,sizeof(sIP)),ntohs(client.sin_port));printf("n==%d,buf=%s",n,buf);//将小写转换成大写for(i=0;i<n;i++){buf[i]=toupper(buf[i]);}//发送数据Write(cfd,buf,n);}close(cfd);exit(0);}}//关闭监听文件描述符close(lfd);return 0;
}

结果如下:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部