socket之面向连接编程(TCP)

原创 2016年06月01日 09:47:52

面向连接(有连接)编程的网络应用程序的流程固定,只需要创建服务器和客户端两个应用程序,利用网络传输进行通信

面向连接的服务器端的流程如下

1> 创建套接字(socket)
2> 服务的绑定(bind)
3> 服务的侦听(listen)
4> 处理新到连接(accept)
5> 数据收发(recv/send)
6> 关闭套接字(close)

面向连接的客户端的流程

1> 创建客户端套接字(socket)
2> 发起连接(connect)
3> 数据的收发(recv\send)
4> 套接字的关闭(close)

有连接的编程过程图示:

这里写图片描述

以下是一个简单的有连接的程序实现:


//服务器端的代码
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define QUEUE_SIZE 6        
#define SERVER_PORT 7070    //服务器的端口号
#define SERVER_IP  "192.168.3.66"   //服务器的IP地址

int main(int ac, char *av[])
{
    int sockser = socket(AF_INET, SOCK_STREAM, 0);   //得到服务器端的套接字
    if(sockser == -1){  //得到套接字失败
        printf("socket error.\n");
    }

    //设置地址重用(必须要在绑定之前设置)
    int yes = 1;
    if(setsockopt(sockser, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
        perror("setsockopt");

    struct sockaddr_in addrser, addrcli;   //服务器和客户的地址结构体
    addrser.sin_family = AF_INET;   //设置地址的协议家族
    addrser.sin_port = htons(SERVER_PORT);   //设置地址的端口号
    addrser.sin_addr.s_addr = inet_addr(SERVER_IP);   //设置地址的IP地址

    socklen_t socklen = sizeof(struct sockaddr);   //服务器或客户端的地址结构大小
    int res = bind(sockser, (struct sockaddr*)&addrser, socklen);   //将服务器地址和服务器套接字绑定
    if(res == -1){   //绑定失败
        printf("bind error.\n");
    }

    int res1 = listen(sockser, QUEUE_SIZE);  //监听
    if(res1 == -1){
        printf("listen error.\n");
    }

    printf("wait cli connect.......\n");
    int acc = accept(sockser, (struct sockaddr*)&addrcli, &socklen);  //接收客户端的连接
    if(acc == -1){  //连接失败
        printf("accept error.\n");
    }

    char sendbuf[256];
    char recvbuf[256];
    //客户和服务器之间通信
    //TCP协议下客户和服务器的收发消息的顺序没有要求,谁先发都可以,但是UDP协议必须是客户端先给服务器发消息,这样服务器才会知道自己在和谁通信(因为UDP是无连接的协议)
    while(1){
        printf("Ser:>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){
            break;
        }
        send(acc, sendbuf, strlen(sendbuf) + 1, 0);  //服务器给客户端发消息
        recv(acc, recvbuf, 256, 0);   //服务器接收客户端的消息
        printf("Cli:> %s\n", recvbuf);
    }
    close(sockser);  //通信结束,关闭服务器端的套接字
    return 0;
}


//客户端的代码
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

#define SERVER_PORT 7070
#define SERVER_IP  "192.168.3.66"

int main(int ac, char *av[])
{
    int sockcli = socket(AF_INET, SOCK_STREAM, 0);   //得到客户端的套接字
    if(sockcli == -1){  //得到套接字失败
        perror("sockcli");
    }

    struct sockaddr_in addrser;   //服务器的地址结构
    addrser.sin_family = AF_INET;   //设置服务器的协议家族
    addrser.sin_port = htons(SERVER_PORT);  //设置服务器的端口
    addrser.sin_addr.s_addr = inet_addr(SERVER_IP);  //设置服务器的IP地址

    socklen_t addrlen = sizeof(struct sockaddr);   //得到服务器的地址的大小
    int res = connect(sockcli, (struct sockaddr*)&addrser, addrlen);   //连接服务器
    if(res == -1){  //连接服务器失败
        perror("connect");  
    }else{          //连接服务器成功
        printf("cli connect ser ok.\n");
    }

    char sendbuf[256];
    char recvbuf[256];
    //服务器和客户端进行通信
    while(1){
        recv(sockcli, recvbuf, 256, 0);   //客户端先接收服务器发来的消息
        printf("ser:> %s\n", recvbuf);
        printf("cli:>");
        scanf("%s", sendbuf);
        if(strncmp(sendbuf, "quit", 4) == 0){
            break;
        }
        send(sockcli, sendbuf, strlen(sendbuf) + 1, 0);   //客户端发送消息
    }
    close(sockcli);  //通信结束,关闭客户端的套接字

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[Linux网络编程] 循环服务器的实现

一、循环服务器的定义 循环服务器描述了在一个时刻只处理一个请求的服务器实现方式,通过在单线程内设置循环控制实现对多个客户端请求的逐一响应,这种服务器的设计、编程、调试和修改往往比较容易去实现。在循环执...
  • zhengqijun_
  • zhengqijun_
  • 2016年11月17日 19:39
  • 691

TCP面向连接中的“连接”究竟是什么,可靠与不可靠

网上搜集的一些答案: 连接是对状态的保持,我是这样理解的 实际上就是在客户端和服务器端都维护一个变量,这个变量维护现在数据传输的状态,例如传输了哪些数据,下一次需要传输哪些数据,等等,...
  • haizhongyun
  • haizhongyun
  • 2012年05月31日 19:59
  • 6829

基于面向连接和无连接的socket编程

基于面向连接的socket编程 基于面向连接的socket编程就是基于TCP的socket编程。基于TCP的socket编程的服务器器端程序和客户端程序的流程如下: 服务器端程序 1、创建套接字...
  • u011484045
  • u011484045
  • 2015年12月01日 17:17
  • 1846

基于UDP(面向无连接)的socket编程

最近在学网络编程,当是记一下笔记
  • zhonghua123
  • zhonghua123
  • 2014年04月21日 11:42
  • 566

Socket网络程序设计(4) ———— 实现linux和windows的文件传输

用TCP/TP进行网际互连(4)———— 实现linux和windows的文件传输 1.在循环面向连接的程序基础上,利用tcp完成linux和windows平台的文件传输 2.对服务器程序进行合理...
  • KevinBetterQ
  • KevinBetterQ
  • 2017年08月10日 10:18
  • 566

Socket网络程序设计(3) ———— 利用tcp完成文件传输的设计和实现

用TCP/TP进行网际互连(3)———— 利用tcp完成文件传输的设计和实现 1.利用循环面向连接的模型完成固定文件的传输 2.由固定文件扩展成手动输入或选择文件 3.参考connectT...
  • KevinBetterQ
  • KevinBetterQ
  • 2017年08月10日 09:55
  • 456

Linux网络编程14——tcp、udp迭代服务器

服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器。 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器...
  • lianghe_work
  • lianghe_work
  • 2015年06月15日 10:26
  • 1335

Socket网络编程学习笔记(2):面向连接的Socket

在上一篇中,我列了一些常用的方法,可以说这些方法是一些辅助性的方法,对于分析网络中的主机属性非常有用。在这篇中,我将会介绍一下面向连接(TCP)socket编程,其中辅以实例,代码可供下载。    ...
  • kingshown_WZ
  • kingshown_WZ
  • 2016年08月03日 14:51
  • 407

[Linux网络编程] 循环服务器的实现

一、循环服务器的定义 循环服务器描述了在一个时刻只处理一个请求的服务器实现方式,通过在单线程内设置循环控制实现对多个客户端请求的逐一响应,这种服务器的设计、编程、调试和修改往往比较容易去实现。在循环执...
  • zhengqijun_
  • zhengqijun_
  • 2016年11月17日 19:39
  • 691

面向连接服务、无连接服务

1、面向连接的服务:就是通信双方在通信时,要事先建立一条通信线路,其过程有建立连接(通过三次握手的方式建立,建立连接是需要分配相应的资源如缓冲区,以保证通信能正常进行)、使用连接和释放连接三个过程。它...
  • ljabclj
  • ljabclj
  • 2015年04月21日 09:32
  • 1925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket之面向连接编程(TCP)
举报原因:
原因补充:

(最多只允许输入30个字)