服务器端:

 #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. 如何将松散的dll打包进需要发布的exe

    我们需要发布的exe文件很多时候都可能会依赖于一堆松散的dll,如果想在发布的时候只提供exe文件,而不想把一大堆dll一起放在和exe同一个文件夹下,是有方法的,该方法由CLR via C#作者提出 ...

  2. Android 使用 Gmail 来发送邮件

    Android 使用 Gmail 来发送邮件 1. [代码]SendMail.java package org.apache.android.mail; import android.app.Acti ...

  3. [ES6] 18. Map

    ES6 provides Map, it is a set of k-v pair. Key can be number, string, object, function and even unde ...

  4. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

  5. Windows 7中使用Eclipse 使用CDT and WinGW 开发C/C++(转载)

    以前使用visual studio 2010编写C/C++,后来接触了Eclipse后,据说eclipse也可以编写C/C++,以前觉得Visual studio 2010还蛮不错的,也没有多大好奇心 ...

  6. 移动互联网(APP)产品设计的经验分享【转】

    随着移动互联网的发展,越来越多的Web产品开始布局移动端,因此最近经常碰到PM们在交流讨论移动APP产品的设计.我从事移动互联网已经有一年多了,通过不断的学习和实践也积累了一些心得,今天整理并分享一下 ...

  7. iPhone screen size

      iPhone 4 iPhone 5 iPhone 6 iPhone 6 Plus Display Size 3.5 in 4 in 4.7 in 5.5 in Screen Size 320 x ...

  8. Mysql 5.6 新特性(转载)

    本文转载自 http://blog.csdn.net/wulantian/article/details/29593803 感谢主人的辛苦整理 一,安全提高 1.提供保存加密认证信息的方法,使用.my ...

  9. 为什么我要称自己为Javascript程序员

    Aaron Griffin写了一篇精彩的牢骚文章,主要是关于各种框架和它们能把程序员从主要业务编程中抽离出来的功能特征.概括一下他的主要论点,当你成为了一个“Rails程序员”,你使用的是一种易于理解 ...

  10. ubuntu14_pip 安装

    1:install pip python-dev    sudo apt-get install python-dev    sudo apt-get install libevent-dev     ...