服务器端:

 #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不阻塞的更多相关文章

  1. 基于MFC的socket编程(异步非阻塞通信)

       对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...

  2. 【转】【win网络编程】socket中的recv阻塞和select的用法

    在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在 ...

  3. Linux 网络编程七(非阻塞socket:epoll--select)

    阻塞socket --阻塞调用是指调用结果返回之前,当前线程会被挂起.函数只有在得到结果之后才会返回. --对于文件操作 read,fread函数调用会将线程阻塞(平常使用read感觉不出来阻塞, 因 ...

  4. socket编程里的read和recv函数【转载】

    本文转载自:http://blog.163.com/like12@126/blog/static/63023403201291983117551/ 1.read 与 recv 区别 read 原则: ...

  5. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

  6. socket编程 —— 非阻塞socket (转)---例子已上传至文件中

    在上一篇文章 <socket编程——一个简单的例子> http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单 ...

  7. socket编程中write、read和send、recv之间的区别~转载

    socket编程中write.read和send.recv之间的区别   http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立 ...

  8. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  9. [转]Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

  10. Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

随机推荐

  1. bat 简单命令实现编译cocos2d-x android项目

    新建一个compile_cmd.bat文件,存放需要执行的命令: cocos compile -p android -j 4 然后,如果直接运行这个文件,在编译完之后命令行窗口会自动退出,这样我们无法 ...

  2. 高并发网络编程之epoll详解

    select.poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在大数据.高并发.集群等一些名词 ...

  3. 配置Windows Live Writer,写cnblogs博客

    引言        以前写博客一般都是联网在cnblogs上面写,不好的地方就是不联网就写不了,当然我们也可以先记录在word文件,等联网在从word里面拷贝出来发布到cnblogs上面,但是样式这些 ...

  4. Python 2.x and 3.x String VS Bytes

    In Python 3 unicode strings are the 'regular strings' (str) and byte strings are separate objects. L ...

  5. fancybox的使用

    fancybox,个人没有深入了解,只是为了工作需要,做的一些界面,主要是用的AJAX功能. 首先,需要下载fancybox的js文件以及CSS文件(可能用不到) 其次,在页面中引入 <scri ...

  6. Simple Arithmetics

    def Add(a, b): l = [] alen = len(a) blen = len(b) result = str(int(a) + int(b)) relen = len(result) ...

  7. 【Irrlicht鬼火引擎】 安装配置Irrlicht鬼火引擎

    一.下载引擎 官方网站:http://irrlicht.sourceforge.net/‎ 官方网站需要FQ才能进入,如果不想FQ,可以通过其他下载地址:CSDN下载:http://download. ...

  8. hostname

    http://www.linuxidc.com/Linux/2014-11/109238.htm

  9. Bootstrap ACE后台管理界面模板-jquery已整理

    做后台通用模板,基于bootstrap,jquery写成的模板,非常齐全.国内不能正常访问google我将不能访问的jquery替换成cdn.bootcss.com网站下的jquery 链接: htt ...

  10. ActiveMQ(5.10.0) - 使用 JDBC 持久化消息

    1. 编辑 ACTIVEMQ_HOME/conf/activemq.xml. <beans> <broker brokerName="localhost" per ...