1. 列表内容

IDE: Clion 2017.01
OS:Ubuntu 16.04 xenial
Main reference: http://blog.chinaunix.net/uid-27007072-id-3390521.html
先打开server.cpp, 连接client收到对方的消息,点到点连接,一对一。

server.cpp 共7步,开头结尾为建立与关闭socket

***
#include <iostream>
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/time.h> 
using namespace std;
#define BUFLEN 1024 //缓冲区长度
#define PORT 6666
#define LISTNUM 20 //等待连接队列的最大长度

int main() 
{ 
    int sockfd, newfd; 
    struct sockaddr_in s_addr, c_addr; 
    char buf[BUFLEN]; 
    socklen_t len; 
    unsigned int port, listnum; 
    fd_set rfds;  //Local variable is never used
    struct timeval tv; 
    int retval,maxfd;  //Local variable is never used

    /*1.建立socket*/ 
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){ 
                //PF 表示PROTOCL FAMILY 协议族
                // SOCK_STREAM 表示采用TCP协议
                // 0是通常的默认情况
        perror("socket"); 
        exit(errno); 
    }else 
        printf("socket create success!\n"); 
        /*2.准备通信地址*/
    memset(&s_addr,0,sizeof(s_addr)); 
    s_addr.sin_family = AF_INET;  //sin_family协议族,AF_INET采用TCP/IP协议
    s_addr.sin_port = htons(PORT);  // socket对应的端口
    s_addr.sin_addr.s_addr = htons(INADDR_ANY);  //INADDR_ANY对本机所有IP有效,INADDR_ANY相当 于inet_addr("0.0.0.0");***
    //1.2两步与client相同 
    /*3.绑定socket与通信地址 */
    if((bind(sockfd, (struct sockaddr*) &s_addr,sizeof(struct sockaddr))) == -1){
        perror("bind");
        exit(errno);
    }else
        printf("bind success!\n"); //绑定成功
    /*4.监听(等待连接)*/
    if(listen(sockfd,listnum) == -1){
        perror("listen");
        exit(errno);
    }else
        printf("the server is listening!\n");
    socklen_t _size = sizeof(struct sockaddr);
    /*5.accept函数(连接)*/
    newfd = accept(sockfd,(sockaddr*)&c_addr,&_size);
    /*6.连接成功,把accept返回的socket描述符当做文件描述符进行操作,可以用四个函数,write,read,send,recv,*/
    if(newfd < 0){
        cout<<"accept failed."<<endl;
    }

    while(1){
        cout<<"recv"<<endl;
        len = recv(newfd,buf,BUFLEN,0);
        buf[len] = '\0';
        cout<<buf<<endl;
    }
    /*7.关闭socket描述符*/
    close(sockfd);
    return 0;
}

client.cpp 共五步,开头结尾为建立与关闭socket

***
#include <iostream>
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sys/time.h> 
using namespace std;
#define BUFLEN 1024 //缓冲区长度
#define PORT 6666
#define LISTNUM 20 //等待连接队列的最大长度

int main() 
{ 
    int sockfd, newfd; 
    struct sockaddr_in s_addr, c_addr; 
    char buf[BUFLEN]; 
    socklen_t len; 
    unsigned int port, listnum; 
    fd_set rfds;  //Local variable is never used
    struct timeval tv; 
    int retval,maxfd;  //Local variable is never used

    /*1.建立socket*/ 
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){ 
                //PF 表示PROTOCL FAMILY 协议族
                // SOCK_STREAM 表示采用TCP协议
                // 0是通常的默认情况
        perror("socket"); 
        exit(errno); 
    }else 
        printf("socket create success!\n"); 
        /*2.准备通信地址*/
    memset(&s_addr,0,sizeof(s_addr)); 
    s_addr.sin_family = AF_INET;  //sin_family协议族,AF_INET采用TCP/IP协议
    s_addr.sin_port = htons(PORT);  // socket对应的端口
    s_addr.sin_addr.s_addr = htons(INADDR_ANY);  //INADDR_ANY对本机所有IP有效,INADDR_ANY相当 于inet_addr("0.0.0.0");***
//上面1.2与server相同
    /*3.建立连接connect*/
    if(connect(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr)) == -1){  
        perror("connect");
        exit(errno);
    }else
        printf("conncet success!\n");
/*4.类似于server中的第六步,连接成功,把accept返回的socket描述符当做文件描述符进行操作*/
    while(1){
        int ret = send(sockfd,"hello",strlen("hello"),0);
        if(ret < 0){
            cout<<"send failed."<<endl;
        } else
            cout<<"send successful! "<<endl;
        sleep(1); //暂停1秒
    }
    /*4.关闭连接*/
    close(sockfd); //关闭socket
    return 0;
}