关于socket编程,以下文章写得比较好:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html

1. accept()函数,如果客户端一直没有连接,则服务端阻塞在accept()函数处。

以下是client代码

//============================================================================
// Name : client.cpp
// Author : yjzhuang
// Version :
// Copyright : yjzhuang@corp.netease.com
// Description : Hello World in C++, Ansi-style
//============================================================================ #include <iostream>
#include <sys/select.h>
#include <sys/socket.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <string.h>
using namespace std; #define SERVER_IP "127.0.0.1"
#define SERVER_PORT 9090
#define BUFSIZE 1024 int getSocket(){
int fd =socket( AF_INET, SOCK_STREAM, );
cout<<"fd="<<fd<<endl;
if(- == fd){
cout<<"Error, fd is -1"<<endl;
}
return fd;
} /**
* 连接到server端,如果成功,返回fd,如果失败返回-1
*/
int connectServer(){
int fd = getSocket();
cout<<"fd= "<<fd<<endl;
if(- == fd){
cout<<"Error, connectServer() quit"<<endl;
return -;
}
struct sockaddr_in remote_addr; //服务器端网络地址结构体
memset(&remote_addr,,sizeof(remote_addr)); //数据初始化--清零
remote_addr.sin_family=AF_INET; //设置为IP通信
remote_addr.sin_addr.s_addr=inet_addr(SERVER_IP);//服务器IP地址
remote_addr.sin_port=htons(SERVER_PORT); //服务器端口号
int con_result = connect(fd, (struct sockaddr*) &remote_addr, sizeof(struct sockaddr));
if(con_result < ){
cout<<"Connect Error!"<<endl;
return -;
}
cout<<"con_result="<<con_result<<endl;
return fd;
} /**
*** 连接到server端,并且不断往server端发送心跳数据
*/
void* heartBeat(void* arg){
cout<<"Heart bead started!"<<endl;
int fd = connectServer();
if(fd<){
cout<<"Heart bead quit!"<<endl;
return ;
}
char buf[BUFSIZE]; //数据传送的缓冲区
string value = "This is heart beat msg!";
strcpy(buf, value.c_str());
while(true){
cout<<"to write data"<<endl;
cout<<"buf="<<buf<<", len="<<strlen(buf)<<endl;
int write_num = write(fd, buf, strlen(buf));
cout<<"write_num="<<write_num<<endl;
sleep();
}
cout<<"Heart bead finished!"<<endl;
return ;
} /**
*** 创建一个新线程,在新线程里调用heartBeat()函数
*/
void threadCall(){
pthread_t thread;
pthread_create(&thread,NULL,heartBeat,NULL);
pthread_detach(thread);
}
int main() {
cout << "main started" << endl; // prints Hello World!!!
threadCall();
sleep();
cout<<"main finished"<<endl;
return ;
}

以下是server代码

/*
* server.cpp
*
* Created on: 2014年11月14日
* Author: yjzhuang
*/ #include <iostream>
#include <sys/select.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <string.h>
using namespace std; #define SERVER_IP "127.0.0.1"
#define SERVER_PORT 9090
#define BUFSIZE 1024 int getSocket(){
int fd =socket( AF_INET, SOCK_STREAM, );
if(- == fd){
cout<<"Error, fd is -1"<<endl;
}
return fd;
} int main(){
int fd = getSocket();
if(fd<){
cout<<"Error in main(), fd<0"<<endl;
}
cout<<"fd="<<fd<<endl;
//----为服务器主线程绑定ip和port------------------------------
struct sockaddr_in local_addr; //服务器端网络地址结构体
memset(&local_addr,,sizeof(local_addr)); //数据初始化--清零
local_addr.sin_family=AF_INET; //设置为IP通信
local_addr.sin_addr.s_addr=inet_addr(SERVER_IP);//服务器IP地址
local_addr.sin_port=htons(SERVER_PORT); //服务器端口号
int bind_result = bind(fd, (struct sockaddr*) &local_addr, sizeof(struct sockaddr));
if(bind_result < ){
cout<<"Bind Error in main()"<<endl;
return -;
}
cout<<"bind_result="<<bind_result<<endl;
//---------------------------------------------
listen(fd, );
struct sockaddr_in remote_addr;
int sin_size=sizeof(struct sockaddr_in);
cout<<"before accept"<<endl;
int new_fd = accept(fd, (struct sockaddr*) &remote_addr, (socklen_t*)&sin_size);
cout<<"after accept"<<endl;
if(new_fd < ){
cout<<"Accept error in main()"<<endl;
return -;
}
cout<<"new_fd accepted is "<<new_fd<<endl;
char buffer[BUFSIZE];
while(true){
cout<<"wait to read data..."<<endl;
int len = read(new_fd, buffer, BUFSIZE);
if(len == ){
cout<<"Read from socket finished"<<endl;
return ;
}else if(len < ){
cout<<"Read from socket error"<<endl;
return -;
}
cout<<"Accept data:"<<buffer<<endl;
sleep();
}
}

一个linux下socket编程的例子,client连server的更多相关文章

  1. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  2. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  3. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

  4. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  5. [转] - linux下socket编程实例

    一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...

  6. c++ 网络编程(七) LINUX下 socket编程 基于套接字的标准I/O函数使用 与 fopen,feof,fgets,fputs函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614820.html 一.标准I/O 1,什么是标准I/O?其实是指C语言里的文件操作函数,如 ...

  7. linux下socket编程-进程间通信

    一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...

  8. linux下socket编程

    相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...

  9. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

随机推荐

  1. [转] [翻译]图解boost::bind

    http://kelvinh.github.io/blog/2013/12/03/boost-bind-illustrated/ 其实这是很久之前留的一个坑了,一直没有填.. 记得在刚开始看到 boo ...

  2. Swift还是Objective-C

    Swift还是Objective-C   Swift还是Objective-C? Swift语言发布已经两年了,iOS开发需要学习C或者Objective-C.此外,人们似乎还在迷惑Swift到底适合 ...

  3. Windows Azure上的Odoo(OpenERP)

    OpenERP 改名为 Odoo 了,感觉名字怪怪的.Windows Azure也进入国内了,学习了一段时间的Azure,把它门结合在一起搞搞吧!本系列文章不涉及开发,纯属环境搭建及Odoo 系统功能 ...

  4. 本地代码上传 -> Github

    首先在控制台cd到你的本地项目,这里以teat为例 1.执行命令:  git init 2.将项目文件添加到仓库中:  git add . (可以是指定文件,将“.”转换为指定文件) 3.接下来com ...

  5. Listbox与dataGridView的获取鼠标点击事件的区别!!!

    lisxian.SelectedIndex = index; Listbox获取鼠标的代码!!!! DataGridViewRow currenRow = this.dgvxian3.Rows[ind ...

  6. C# 深入浅出 委托与事件

    C#中的委托和事件的概念接触很久了,但是一直以来总没有特别透彻的感觉,现在我在这里总结一下: 首先我们要知道委托的由来,为什么要使用委托了? 我们先看一个例子: 假设我们有这样一个需求,需要计算在不同 ...

  7. indexedDB bootstrap angularjs 前端 MVC Demo

    前端之MVC应用 1.indexedDB(Model): 数据层,前端浏览器 HTML5 API 面向对象数据库,一般现在用的数据库都是关系型数据库. 那么indexeddb有什么特点呢: 首先,从字 ...

  8. C++函数覆盖的思考

    最近碰到一些问题,一开始很难调试和解决,最后发现原来是在基类函数的模板方法中对子类需要重写的函数没有使用virtual,如下 class Base { public: void say(){test( ...

  9. #define和const的简单区别

    面试常问:宏#define和const有什么区别? 1.编译器处理方式 define宏是在预处理阶段展开 const常量是在编译阶段使用 2.类型和安全检查不同 define宏没有类型,不做安全检查, ...

  10. 关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)

    官网http://www.hcharts.cn/ 引入下列文件 <script type="text/javascript" src="http://cdn.hch ...