一个linux下socket编程的例子,client连server

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

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

以下是client代码

//============================================================================
// Name        : client.cpp
// Author      : yjzhuang
// Version     :
// Copyright   : [email protected]
// 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, 0 );
    cout<<"fd="<<fd<<endl;
    if(-1 == fd){
        cout<<"Error, fd is -1"<<endl;
    }
    return fd;
}

/**
 * 连接到server端,如果成功,返回fd,如果失败返回-1
 */
int connectServer(){
    int fd = getSocket();
    cout<<"fd= "<<fd<<endl;
    if(-1 == fd){
        cout<<"Error, connectServer() quit"<<endl;
        return -1;
    }
    struct sockaddr_in remote_addr; //服务器端网络地址结构体
    memset(&remote_addr,0,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 < 0){
        cout<<"Connect Error!"<<endl;
        return -1;
    }
    cout<<"con_result="<<con_result<<endl;
    return fd;
}

/**
*** 连接到server端,并且不断往server端发送心跳数据
*/
void* heartBeat(void* arg){
    cout<<"Heart bead started!"<<endl;
    int fd = connectServer();
    if(fd<0){
        cout<<"Heart bead quit!"<<endl;
        return 0;
    }
    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(2);
    }
    cout<<"Heart bead finished!"<<endl;
    return 0;
}

/**
*** 创建一个新线程,在新线程里调用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(10000000);
    cout<<"main finished"<<endl;
    return 0;
}

以下是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, 0 );
    if(-1 == fd){
        cout<<"Error, fd is -1"<<endl;
    }
    return fd;
}

int main(){
    int fd = getSocket();
    if(fd<0){
        cout<<"Error in main(), fd<0"<<endl;
    }
    cout<<"fd="<<fd<<endl;
    //----为服务器主线程绑定ip和port------------------------------
    struct sockaddr_in local_addr; //服务器端网络地址结构体
    memset(&local_addr,0,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 < 0){
        cout<<"Bind Error in main()"<<endl;
        return -1;
    }
    cout<<"bind_result="<<bind_result<<endl;
    //---------------------------------------------
    listen(fd, 10);
    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 < 0){
        cout<<"Accept error in main()"<<endl;
        return -1;
    }
    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 == 0    ){
            cout<<"Read from socket finished"<<endl;
            return 0;
        }else if(len < 0){
            cout<<"Read from socket error"<<endl;
            return -1;
        }
        cout<<"Accept data:"<<buffer<<endl;
        sleep(10);
    }
}
时间: 2025-01-05 00:41:35

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

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

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

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

Linux下socket编程基本知识

本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linux网络编程 Linux网络编程|人工智能物联网 1.概念 1.1套接字(socket) Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段. Linux中的网络编程通过socket接口实现,socket既是

Linux下socket编程(转载自http://blog.csdn.net/hguisu/article/details/7445768/)

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

linux下socket编程-进程间通信

一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM).流式是一种面向连接针对于面向连接的TCP服务应用:数据报式Socket是一种无连接针对无连接的UDP服务应用.sock通信的基本过程如下: 二.Socket建立 程序可以调用Socket函数建立socket,该函数返回一个类似

linux下socket编程归纳记录

所需头文件: #include<sys/types.h> #include<sys/socket.h> 基础套接字: 返回值: 0表示成功 -1表示失败 errno记录错误代码 1:创建套接字 int socket(int domain, int type, int protocol) 参数描述: domain:套接字域名 { AF_UNIX:用于本地通信 AF_INET:IPv4,Internet协议(本例使用该域名做参考) AF_INET6:IPv6,Internet协议 .

windows下socket编程小例子

服务端 首先引进头文件winsock2.h和库文件ws2_32.lib(开发环境为vs2015) 加载套接字库和创建套接字 绑定套接字到一个IP地址和端口上 监听客户端发来的连接请求 接收或发送信息 关闭套接字,套接字库 客户端 首先引进头文件winsock2.h和库文件ws2_32.lib(开发环境为vs2015) 加载套接字库,创建套接字对象 向服务端发出连接请求 收发信息 关闭套接字和套接字库 注释 WSAStartup结构体中主要包含了系统所支持的Winsock版本信息 WSAstart

Linux下socket编程 address already in use 问题

我在编写服务端程序时,结束服务器端程序运行后,再次启动程序,bind函数就会返回address already in use这个错误,提示我端口已经被占用了. 使用 # netstat –apn | grep [port] 命令或者 lsof -i:[port] 命令查看端口的占用情况,可以发现之前被终止的服务器端程序进程仍在监听该端口.于是用kill命令杀掉再启动就可以正常运行了.后来在这篇文章找到了原因http://www.ibm.com/developerworks/cn/linux/l-