reuseaddr和点对点聊天
解决绑定失败
在测试时,经常会出现绑定错误,bind error: Address already in use
这里只要指定一下socket的reuseaddr属性即可解决
int on=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on) <0)
err_quit("setsockopt");
bind(...)
点对点
1.本例子使用双进程,一个用于接受信息,一个用于发送消息
2.当read(sockfd)0或read(connfd)0时,需要两个进程都退出,此处用SIGUSR1作为通知信号
client.c
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void err_quit(const char *s){
perror(s);
exit(1);
}
void handler(int signo){
printf("program terminated\n");
exit(0);
}
int main(int argc,char *argv[]){
int sockfd;
struct sockaddr_in servaddr;
char buff[1024];
pid_t child;
if((sockfd=socket(PF_INET,SOCK_STREAM,0)) < 0)
err_quit("socket");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servaddr.sin_port=htons(5566);
if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) <0)
err_quit("connect");
if((child=fork()) <0)
err_quit("fork");
else if(child == 0){
signal(SIGUSR1,handler);
while(fgets(buff,sizeof(buff),stdin) != NULL)
write(sockfd,buff,strlen(buff));
}else{
while(1){
memset(buff,0,sizeof(buff));
int nread=read(sockfd,buff,sizeof(buff));
if(nread == -1)
err_quit("read");
if(nread == 0){
printf("perr closed\n");
break;
}
fputs(buff,stdout);
}
kill(child,SIGUSR1);
}
exit(0);
}
server.c
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void err_quit(const char *s){
perror(s);
exit(1);
}
void handler(int signo){
printf("program terminated\n");
exit(0);
}
int main(int argc,char *argv[]){
int sockfd,connfd;
pid_t child;
socklen_t len;
struct sockaddr_in addr,client;
char buff[1024];
if((sockfd=socket(PF_INET,SOCK_STREAM,0)) < 0)
err_quit("sockfd");
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(5566);
int on=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) <0)
err_quit("setsockopt");
if(bind(sockfd,(struct sockaddr *)&addr,sizeof(addr))<0)
err_quit("bind");
if(listen(sockfd,10)<0)
err_quit("listen");
len=sizeof(client);
connfd=accept(sockfd,(struct sockaddr *)&client,&len);
if(connfd < 0)
err_quit("accept");
if((child=fork())<0){
err_quit("fork");
}else if(child == 0){
while(1){
bzero(buff,sizeof(buff));
int nread=read(connfd,buff,1024);
if(nread == -1)
err_quit("read");
if(nread == 0){
printf("peer closed\n");
break;
}
fputs(buff,stdout);
}
kill(getppid(),SIGUSR1);
}else{
signal(SIGUSR1,handler);
while(fgets(buff,sizeof(buff),stdin) != NULL){
write(connfd,buff,strlen(buff));
}
}
exit(0);
}
reuseaddr和点对点聊天的更多相关文章
- Activemq mqtt 点对点聊天实现(转载)
我这想到一个点对点聊天的方法,不用没割人都建立一个topic了,思路还是自定义一个分发策略,具体如下: 1. 建立一个topic,所有人都用匹配订阅的方式订阅以该topic为头的topic,例如:所 ...
- Linux 网络编程详解三(p2p点对点聊天)
//p2p点对点聊天多进程版--服务器(信号的使用) #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- ASP.NET SingalR 点对点聊天实现思路总结
前一段时间写了一个简单的聊天室,是群聊的方式.博客地址:http://www.cnblogs.com/panzi/p/4980346.html.还有一种需求就是常见的尤其是培训机构的主页面,经常会有1 ...
- 利用select单线程点对点聊天
select的优点与使用方法 select用单线程的方法遍历所有待读写的I/O接口, 当有接口可用时就会返回. select可设置电脑阻塞或非阻塞. 特别注意: 每次select前都要重新初始化集合和 ...
- python实现的简单点对点(p2p)聊天
点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages) ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 聊天工具实现winform端实现
最近在找能够实现客户端点对点聊天的技术,通过github我发现了一个项目,它能够支持webscoket通讯,服务端是由c#socket完成. 我要的是winform端的通信,所以在他的基础上,增加了桌 ...
- WebSocket(3)---实现一对一聊天功能
实现一对一聊天功能 功能介绍:实现A和B单独聊天功能,即A发消息给B只能B接收,同样B向A发消息只能A接收. 本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocket]---实现游戏公告功能 ...
- tornado+websocket+mongodb实现在线视屏文字聊天
最近学了tornado和mongo,所以结合websocket 实现一个聊天功能,从而加深一下相关知识点的印象 1.websocket概览 webscoket是一种全双工通信模式的协议,客户端连接服务 ...
随机推荐
- SpringBoot中设置自定义拦截器
SpringBoot中设置自动以拦截器需要写一个类继承HandlerInterceptorAdapter并重写preHandle方法 例子 public class AuthorityIntercep ...
- 【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU
从本节开始我们就进入到本章的最后一节内容了,也就是我们算术逻辑单元的它的实现.这部分呢是数字电路的一些知识,所以呢,如果你没有学过数字电路的话,也不要慌张,我会从基础开始给大家补起.那么在计算机当中, ...
- 快速禁止Chrome浏览器缓存
在前端的开发中,最麻烦的莫过于浏览器的缓存,经常需要清理缓存文件,导致开发效率较低. 但Chrome可以一键禁止浏览器缓存,并且在后续的操作中,无论相同的资源请求多少次,都不会缓存到本地,一起来体验下 ...
- Express 2015 RC for Windows 10 安装
支持的操作系统 Windows 10 Technical Preview 硬件要求 1.6 GHz 或更快的处理器 1 GB RAM(如果在虚拟机上运行,则为 1.5 GB) 4 GB 可用硬盘空间 ...
- Jupyter Notebook 安装与使用
Ref: https://jupyter.org/install Installing Jupyter Notebook with pip python -m pip install --upgrad ...
- Linux性能优化从入门到实战:13 内存篇:内存指标/工具总结、问题定位和调优
内存性能指标 系统内存指标 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存. 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小.tmpfs 其实也是一种特 ...
- vsftp 主动模式安装
server:192.168.109.137 client:192.168.109.138 ------------------------------------------------------ ...
- join 按两个文件的相同字段合并
1.命令功能 join对每一对具相同内容的输入行,合并为一行输出.默认情况是把输入的第一个字段作为连接字段,字段间用空格隔开. 2.语法格式 join option file1 file2 jo ...
- uiautomatorviewer不能直接截取手机屏幕信息
本身可以用sdk——>tools里自带的ui automator viewer截取如果截取不了,采用以下方法: 新建一个文本文档,名字自己起如uni.bat(注意把后缀给改成.bat) adb ...
- tomcat启动报错:Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
1.错误信息: 严重: Error configuring application listener of class org.springframework.web.context.ContextL ...