SOCKET编程:为什么recv不阻塞
服务器端:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <iostream>
#include <vector>
#include <error.h>
using namespace std; int main()
{
double bs_x[] = {,-,,,-};
double bs_y[] = {,,,-,-};
//vector<vector<double> > tdoa;
double tdoa[][]; ifstream infile("otdoa.txt");
if( !infile)
{
cout << "can't open otdoa.txt" << endl;
return -;
}
int i = ;
int j = ;
while(infile)
{
string line;
double a;
//vector<double> ta;
/*infile >> line;
istringstream stream(line);
int j = 0;
while(stream >> a)
{
tdoa[i][j] = a;
j++;
}*/
if( j == )
{
i++;
j = ;
}
infile >> tdoa[i][j];
j++;
if(infile.peek() == '\n')
break;
}
infile.close(); int listenfd,confd;
struct sockaddr_in servaddr; listenfd = socket(AF_INET,SOCK_STREAM,);
if(listenfd < )
{
cout << "can't open socket" << endl;
return -;
} bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); if( bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < )
{
//cout << "bind error" << endl;
perror("bind error");
return -;
} if( listen(listenfd,) < )
{
cout << "listen error" << endl;
return -;
} i = ; //confd = accept(listenfd,(struct sockaddr*)NULL,NULL);
while()
{
confd = accept(listenfd,(struct sockaddr*)NULL,NULL);
if( confd < )
{
cout << "accept error" << endl;
return -;
}
pid_t pid;
pid = fork();
if( pid == )
{
close(listenfd);
cout << "child" << endl;
send(confd,bs_x,sizeof(bs_x),);
send(confd,bs_y,sizeof(bs_y),);
send(confd,tdoa[i],sizeof(tdoa[i]),);
//close(confd);
break;
}
cout << "parent" << endl;
close(confd); i++;
sleep();
}
cout << "child exit" << endl;
close(confd);
return ;
}
客户端:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std; int main()
{
struct data
{
double bs_x[];
double bs_y[];
double tdoa[];
}data_t;
struct data revdata;
char buf[];
int sockfd;
struct sockaddr_in addr; sockfd = socket(AF_INET,SOCK_STREAM,); bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(); if( connect(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < )
{
cout << "connect error" << endl;
return -;
} struct sockaddr_in testaddr;
bzero(&testaddr,sizeof(testaddr));
getsockname(sockfd,(struct sockaddr*)&testaddr,NULL);
char bbb[];
inet_ntop(AF_INET,&testaddr.sin_addr,bbb,sizeof(testaddr));
cout << bbb << endl;
cout << ntohs(testaddr.sin_port) << endl;
while() //死循环
{
//menset(&buf,sizeof(buf));
if( recv(sockfd,buf,sizeof(revdata),MSG_WAITALL) < ) //当服务器端断开连接时,recv失效
{
cout << "recieve msg erro" << endl;
return -;
} bzero(&revdata,);
memcpy(&revdata,buf,sizeof(revdata)); for(int i = ; i < ; i++) //但是这里一直在死循环中输出
{
printf("[%d]\t",i+);
cout << revdata.bs_x[i] <<" "
<< revdata.bs_y[i] << " "
<< revdata.tdoa[i] << endl;
}
}
close(sockfd);
return ; }
因为recv在客户端的死循环中,当服务端断开连接时,recv失效
SOCKET编程:为什么recv不阻塞的更多相关文章
- 基于MFC的socket编程(异步非阻塞通信)
对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...
- 【转】【win网络编程】socket中的recv阻塞和select的用法
在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在 ...
- Linux 网络编程七(非阻塞socket:epoll--select)
阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...
- socket编程里的read和recv函数【转载】
本文转载自:http://blog.163.com/like12@126/blog/static/63023403201291983117551/ 1.read 与 recv 区别 read 原则: ...
- socket编程的同步、异步与阻塞、非阻塞示例详解
socket编程的同步.异步与阻塞.非阻塞示例详解之一 分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...
- socket编程 —— 非阻塞socket (转)---例子已上传至文件中
在上一篇文章 <socket编程——一个简单的例子> http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单 ...
- socket编程中write、read和send、recv之间的区别~转载
socket编程中write.read和send.recv之间的区别 http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...
- java socket编程开发简单例子 与 nio非阻塞通道
基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...
- [转]Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
- Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
随机推荐
- Cocos2d-x多语言支持解决方式
很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 利用.plist文件让Cocos2d-x轻松支持多语言. .plist文件类似 ...
- [AngularJS] Consistency between ui-router states and Angular directives
ui-router's states and AngularJS directives have much in common. Let's explores the similarities bet ...
- [AngularJS] Directive with Transcluded Elements
Create a wrapWith directive using advanced transclusion techniques. transclude - compile the content ...
- rand值出现负数的解决方案
当rand($number)或者mt_rand($number)的时候,$number太大,超过pow(2,31) - 1;即整型最大值的时候,会出现负数. 如果只是单纯转换成整数而已的话,可以采用s ...
- c高级编程4 LD_DEBUG
[root@monitor ~]# LD_DEBUG=help ls Valid options for the LD_DEBUG environment variable are: libs dis ...
- Jordan Lecture Note-9: Principal Components Analysis (PCA).
Principal Components Analysis (一)引入PCA 当我们对某个系统或指标进行研究时往往会发现,影响这些系统和指标的因素或变量的数量非常的多.多变量无疑会为科学研究带来 ...
- App Thinning
App Thinning 由于项目中需要开启Bitcode编译,之前对Bitcode也有些误区,故整理了下相关知识,仅供参考,如有不对,还请指出. 当前 iOS App 的编译打包方式是把适配兼容多个 ...
- uva10004 Bicoloring 黑白染色问题,DFS
又是水题,最近切题目只能切出水题...orz 给出一个联通图,要求在个点上染上两种颜色,相邻的点颜色不能相同,看能不能染色成功. 用dfs搜索一个点的每条边,着色递归,如果已经染过色的且颜色出现矛盾就 ...
- HTML+CSS实例——漂亮的背景(一)
一.网址:http://www.csszengarden.com/?cssfile=213/213.css 二.效果 三.CSS body { background-color:#F0ECD6; ba ...
- Linux学习之路:命令别名、历史记录和命令查找执行顺序
一.命令别名 alias rm='rm –i':删除命令时会随时出现提示;alias vi=vim alias 不加参数,显示系统内所以命令别名 unalias 取消别名 二.历史命令 history ...