一个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   : 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, 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);
    }
}

 

posted on 2015-02-05 18:59  大油蛙  阅读(3280)  评论(0编辑  收藏  举报

导航