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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C# Socket编程(5)使用TCP Socket

TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer)...

socket之面向连接编程(TCP)

面向连接(有连接)编程的网络应用程序的流程固定,只需要创建服务器和客户端两个应用程序,利用网络传输进行通信面向连接的服务器端的流程如下:1> 创建套接字(socket) 2> 服务的绑定(bind)...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

TCP(面向连接)的socket编程

服务器端程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请...

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

服务器端(接收端)程序: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、等待接收数据(recvfrom)。 4、关闭套接字。客户端(发送端)程序:...

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

说明:本程序是基于windows socket的套接字库实现网络编程; 当WSAStartup函数调用成功后,在程序的最后都需要相应的调用WSACleanup函数 以便释放为该应用程序分配的资源,...

Windows网络编程之面向连接的Socket编程

更多精彩内容,请见:http://www.16boke.com by zxy,Java/C++编程交流群:168424095 (1) 介绍 面向连接的Socket通信时基于TCP的。 TCP:T...

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

基于面向连接的socket编程 基于面向连接的socket编程就是基于TCP的socket编程。基于TCP的socket编程的服务器器端程序和客户端程序的流程如下: 服务器端程序 1、创建套接字...

网络编程Socket之UDP(二)面向“连接”的UDP

之前有说到由于udp的不可靠,不返回错误信息导致的阻塞问题,下面t'fu'o

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

转自:http://www.cnblogs.com/licongjie/archive/2006/10/26/540640.html   在上一篇中,我列了一些常用的方法,可以说这些方法...

TCP、HTTP、SOCKET连接

通信
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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