服务器端:

 #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. HDU 3410 &amp;&amp; POJ 3776 Passing the Message 单调队列

    题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...

  2. 暂停和恢复Activity Android

    暂停和恢复Activity(Pausing and Resuming an Activity) 在正常的应用程序使用,前台activity有时会被其他可视化组件遮挡,从而 造成activity的暂停. ...

  3. 关于在android手机中腾讯、阿里产品不自定义虚拟键盘的想法

    1,自定义虚拟键盘,影响用户体验.你每个用户的喜好不一样,都有自己心仪的一款输入法.腾讯或是阿里设计出来的输入法很难满足上亿用户的喜好,到时候又是一场口水战,再说了就是专业的输入法肯定要比应用里嵌套的 ...

  4. [AngularJS] Html ngSanitize, $sce

    Safely render arbitrary HTML snippets by using ngSanitize and $sce. By default angularJS consider us ...

  5. dubbo-RPC学习(二) http protocol

    dubbo中的协议默认支持很多种,从简单的开始,先解读HttpProtocol吧. dubbo中的http-RPC基于spring web支持的http invoker,web容器默认使用jetty. ...

  6. Android(java)学习笔记83:finally关键字的作用

    package cn.itcast_07; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  7. iOS 延时加载

    这里列举了四种线程延时加载的方法, 1.performSelector方法 此方法必须在主线程中执行,并不是阻塞当前的线程 [self performSelector:@selector(delayM ...

  8. 采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序

    采用虚拟命名管道的字符设备和阻塞型I/O实现进程间的通信实现KWIC程序专业程序代写c++程序代写

  9. jboss之mod_cluster集群

    本篇针对的mode_cluster版本是mod_cluster-1.2.6.Final-linux2-x64.tar.gz / mod_cluster-1.2.6.Final-windows-amd6 ...

  10. postgresql常用SQL

    --查看数据库 select * from pg_database; --查看表空间 select * from pg_tablespace; --查看语言 select * from pg_lang ...