linux 中TCP套接字编程实例 显示Bind() error:address already in use 怎么办 用netstat -nat 查看后结果

linux 中TCP套接字编程实例 显示Bind() error:address already in use 怎么办 用netstat -nat 查看后结果,第1张

你所使用的套接字已被占用,在Bind()之前你是否申请了套接字,或者申请之后已经被占用,Bind所使用的套接字来源很重要,可以查查。再有就是linux里面你的程序如果非法退出或者没有使用close释放套接字,在程序结束以后系统会延时自动释放套接字资源,但是要等几分钟,之后你就可以重新使用了。

服务器端

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

#include <stdlib.h>

 

int main(int argc,char* argv)

{

int server_sockfd,client_sockfd

int server_len,client_len

struct sockaddr_in server_address

struct sockaddr_in client_address

//获得一个socket文件描述符,使用tcp ip 协议 

server_sockfd=socket(AF_INET,SOCK_STREAM,0)

server_address.sin_family=AF_INET

//设置服务器端接受任何主机的请求

server_address.sin_addr.s_addr=htonl(INADDR_ANY)

//使用端口9734 来接受请求

server_address.sin_port=htons(9734)

server_len=sizeof(server_address)

//绑定socket 

bind(server_sockfd,(struct sockaddr *)&server_address,server_len)

 

 //监听连接请求,连接请求队列 大小为 5 

listen(server_sockfd,5)

 

while(1)

{

char ch

printf("server waiting\n")

 

client_len=sizeof(client_address)

 

 //接受client 端的连接请求,如果没有连接请求,该进程将阻塞

client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len)

//读数据

read(client_sockfd,&ch,1)

ch++

//写数据

write(client_sockfd,&ch,1)

//关闭与client端的连接

close(client_sockfd)

 

}

}

客户端

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <stdlib.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

 

int main(int argc,char* argv)

{

int sockfd

int len

struct sockaddr_in address

int result

char ch='A'

 

 //设置需要连接服务器的 ip port 

sockfd=socket(AF_INET,SOCK_STREAM,0)

address.sin_family=AF_INET

address.sin_addr.s_addr=inet_addr("127.0.0.1")

address.sin_port=htons(9734)

len=sizeof(address)

 

 //连接服务器

result=connect(sockfd,(struct sockaddr *)&address,len)

if(result==-1)

{

perror("oops:client3")

exit(1)

}

 

 //写数据

write(sockfd,&ch,1)

//读数据

read(sockfd,&ch,1)

printf("char from server=%c\n",ch)

//关闭与服务器的连接

close(sockfd)

exit(0)

 

}

关于你的问题:

1.简单的方法,设置socket套接字为非阻塞模式,然后轮询,并查看是否超时。

或者是使用select poll 等方法 ,设置超时时间。

或者 使用 alarm 信号,都可以。

2..每当接收到一个client 端的连接请求,就开辟一个线程为之服务。

或者使用select poll  epoll等方法,推荐这个。

3.你是指的是处理信号吗?这个有专门的函数 signal 可以处理。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7137540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-02
下一篇 2023-04-02

发表评论

登录后才能评论

评论列表(0条)

保存