socket 在bind出现Address already in use

一只会敲代码的喵 2016-06-30 11:03:07
按网上的方法 已经用setsockopt设置过了 可还是第一次可以正确运行 第二次就开始错误
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <string.h>
int main(){
int res,sockfd;
if((sockfd=socket(AF_UNIX,SOCK_DGRAM,0))==-1) //是本地通信的
perror("socket");
int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));//设置地址可以复用
struct sockaddr_un addr;
addr.sun_family=AF_UNIX;
strcpy(addr.sun_path,"c.sock"); //设置c.sock作为通信地址
if((res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)))==-1) //开始绑定套接字和通信地址
perror("bind");
char buf[10]={0};
if((res=read(sockfd,buf,sizeof(buf)))==-1) //接收服务器发来的数据
perror("read");
printf("收到的数据大小是%d,数据是%s\n",res,buf);
close(sockfd);//关闭socket
return 0;
}

...全文
932 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cangtiantiexue 2016-06-30
  • 打赏
  • 举报
回复
看代码,是在bind()前加入一个删除的语句就可以了. unlink (addr.sun_path);//delete the file link for the function of bind //如果不删除文件,则运行时,会报错: bind: Address already in use ? 但是, 你是客户端,为什么要bind呢? 客户端不应该是 socket, 然后connect吗? 服务端是:socket,然后bind,再然后listen,而后accept.
咔酷咿赤影 2016-06-30
  • 打赏
  • 举报
回复
每次把c.sock文件删除就好了。
  • 打赏
  • 举报
回复
unix domain socket 与网络socket编程最大的不同在于地址格式不同,用结构体socketaddr_un表示,网络地址是由ip加端口号决定,而domain socket的地址是一个socket类型的文件在文件系统的路径,该文件由bind()函数创建并绑定,如果bind时该文件已经存在,则绑定失败。

23,214

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧