关于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. 第四节:教你如何快速让浏览器兼容ES6特性

    写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...

  2. Android系统移植与驱动开发----第一章

    第一章 Android系统移植与驱动开发 Android源代码定制完全属于自己的嵌入式系统,但是支持的设备不多,所以要移植,而在移植的过程中使用的不得不提的是驱动开发. Android系统构架主要包括 ...

  3. (转)Vim用法小结

    这是我转的一些vim基本用法,可能对初用者会有帮助,独乐乐不如众乐乐,是吧! Vim一般的Unix和Linux下均有安装.  三种状态 Command: 任何输入都会作为编辑命令,而不会出现在屏幕上 ...

  4. Aircrack-ng 工具箱

    官网为:http://www.aircrack-ng.org/, 它就是一个与WiFi 相关的工具啦,可以进行一些注入,抓包.破解WiFI等.里面有很多不同的套件. 另外,http://blog.cs ...

  5. C#学习第五天

    字符串的处理 string可作char的只读数组 下面这段字符表示访问每个字符: string myString="A string."; char myChar=myString ...

  6. EXCEL表格常用函数使用的难点

    1.  INDIRECT(ref_text,逻辑值) 返回由文本字符串指定的引用.此函数立即对引用进行计算,并显示其内容.ref_text,文本引用说明, (1) A1-样式的引用(逻辑值,T,缺省) ...

  7. Java方法的参数是按值传递的.【转】

    在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参 ...

  8. 小波 mallat 算法

    算法要求:输入序列是大于滤波器长度的偶数列 确实可以通过编程的手段使算法适合所有的情况,但本文章的目的是展示mallat算法的过程,所以就一切从简了 // Mallat.cpp : Defines t ...

  9. 【USACO 2.2.1】序言页码

    [题目描述] 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 L 50 M 1000 V 5 C 100 X 10 D 500 最多3个同样的可以表 ...

  10. getUrlParam,jQuery中的URL参数获取

    大家经常会需要在一段URL中截取到自己所需参数的值,下面的方法也许能帮到您: $.getUrlParam = function(name){ var reg = new RegExp("(^ ...