Socket TCP网络通信编程

首先,服务器端需要做以下准备工作:

  (1)调用socket()函数。建立socket对象,指定通信协议。

  (2)调用bind()函数。将创建的socket对象与当前主机的某一个IP地和端口绑定。

  (3)调用listen()函数。使socket对象处于监听状态,并设置监听队列大小。

客户端需要做以下准备工作:

  (1)调用socket()函数。建立socket()对象,指定相同通信协议。

  (2)应用程序可以显式的调用bind()函数为其绑定IP地址和端口,当然,也可以将这工作交给TCP/IP协议栈。

接着建立通信连接:

  (1)客户端调用connect()函数。向服务器端发出连接请求。

  (2)服务端监听到该请求,调用accept()函数接受请求,从而建立连接,并返回一个新的socket文件描述符专门处理该连接。

然后通信双方发送/接收数据:

  (1)服务器端调用write()或send()函数发送数据,客户端调用read()或者recv()函数接收数据。反之客户端发送数据,服务器端接收数据。

  (2)通信完成后,通信双方都需要调用close()或者shutdown()函数关闭socket对象。

类比电话通信,面向连接的socket通信实现图

展示一个代码示例:

服务端:

#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include <arpa/inet.h>
#include<pthread.h>

static void usage(const char *proc)
{
    printf("Please use :%s [IP] [port]\n",proc);
}

void thread_run(void *arg)
{
    printf("creat a new thread\n");
    int fd = (int)arg;
    ];

    ){
        memset(buf,'\0',sizeof(buf));
        ssize_t _s = read(fd,buf,);
        ){
            buf[_s] = '\0';
            printf("client say : %s\n",buf);
        }
        memset(buf,'\0',sizeof(buf));
        printf("please Enter: ");
        fflush(stdout);
        ssize_t _s2 = read(,buf,);
        ){
            write(fd,buf,strlen(buf));
        }
    }
}

int main(int argc,char *argv[])
{
    ){
        usage(argv[]);
        exit();
    }

    //1.creat socket

    );
    ){
        perror("creat socket error\n");
        ;
    }

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[]));
    local.sin_addr.s_addr = inet_addr(argv[]);

    //2.bind

    ){
        perror("bind error\n");
        close(sock);
        ;
    }

    //3.listen

    ) < ){
        perror("listen error\n");
        close(sock);
        ;
    }

    printf("bind and listen success!wait accept...\n");

    //4.accept

    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);
    ){

        int fd = accept(sock,(struct sockaddr*)&peer ,&len);

        ){
            perror("accept error\n");
            close(sock);
            ;
        }

        printf("get connect,ip is : %s port is : %d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

        pthread_t id;
        pthread_create(&id,NULL,thread_run,(void*)fd);

        pthread_detach(id);

    }
    close(sock);
    ;
}

客户端:

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<arpa/inet.h>

static void usage(const char *proc)
{
    printf("please use : %s [ip] [port]\n",proc);
}
int main(int argc,char *argv[])
{
     ){
        usage(argv[]);
        exit();
    }

    );
    ){
        perror("socket error");
        ;
    }

    struct sockaddr_in remote;
    remote.sin_family = AF_INET;
    remote.sin_port = htons(atoi(argv[]));
    remote.sin_addr.s_addr = inet_addr(argv[]);

    int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote));
    ){
        printf("connect failed:%s\n",strerror(errno));
        ;
    }

    printf("connect success!\n");

    ];
    ){
        memset(buf,'\0',sizeof(buf));
        printf("please enter:");
        fflush(stdout);
        ssize_t _s = read(,buf,);
        ){
            buf[_s - ] = '\0';
            write(sock,buf,strlen(buf));
            _s = read(sock,buf,);
            ){
                ) == ){
                     printf("qiut\n");
                     break;
                 }
                buf[_s -] = '\0';
                printf("%s\n",buf);
            }
        }
    }
    close(sock);
    ;
}

UDP网络通信编程

客户不与服务器建立链接,而是管使用sendto函数给服务器发送数据报,其中必须指定目的地址(即服务器地址)作为参数。类似的,服务器不接受来自客户的连接,而只管调用

revcfrom函数等待来自某个客户数据的到达。revcfrom将与所接受到的数据报一道返回客户的协议地址,因此服务器可以把响应发送给正确的客户。

服务端示例

//服务端代码示例:

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>

int main(int argc,char *argv[])
{
    ){
        printf(]);
        ;
    }

    );
    ){
        perror("socket error");
        ;
    }

    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[]));
    local.sin_addr.s_addr = inet_addr(argv[]);

    ){
        perror("bind error");
        ;
    }

    ;
    struct sockaddr_in peer;
    socklen_t len = sizeof(peer);

    ];
    while(!done){
        memset(buf,'\0',sizeof(buf));
        recvfrom(sock,buf,,(struct sockaddr*)&peer,&len);
        printf("#########################\n");
        printf("get a client,socket: %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

        printf("client : %s ,echo client!\n",buf);
        printf("#########################\n");
        sendto(sock,buf,,(struct sockaddr*)&peer,len);

    }
    ;
}

Linux socket网络编程基础 tcp和udp的更多相关文章

  1. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  2. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

    BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...

  3. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础

    IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t  inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...

  4. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4

    网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...

  5. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3

    使用之前的函数实现的简单聊天程序 TCP协议 双方实时发送/接收消息 实现后的问题: 可能是我虚拟机的IP地址配得有问题吧.在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通.但是两个虚 ...

  6. 嵌入式linux的网络编程(1)--TCP/IP协议概述

    嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...

  7. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  8. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  9. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

随机推荐

  1. SQL SERVER 表最小行的一个纠结问题

    昨天一个同事突然问我,说他在SQL 2000数据库创建如下表的时候,突然碰到了下面一条警告信息.SQL脚本和警告信息如下: IF OBJECT_ID(N'Log') IS  NULL BEGINCRE ...

  2. Docker入门之常用命令

    写在前面 细数当前最流行的技术莫过于容器化和人工智能了,而容器化技术能有今天的热度,Docker可谓功不可没. 让我们一起来回顾一下Docker 是什么? 是一种虚拟化技术 能够将应用程序自动部署到容 ...

  3. MVC登出友情提示

    好奇心害死猫,话说12月30号,阳历17年末,行至小镇农户,有羊在鸣,由于好奇心泛滥,循声而至,发现一只被拴住的羊,好心喂草,不料反被舔了一口,得亏抽手及时,不然小拇指估计被咬掉,没错,是咬掉,即使如 ...

  4. input里面placeholder水平居中

    <style type="text/css">input::-ms-input-placeholder{text-align: center;}input::-webk ...

  5. 使用Z3破解简单的XOR加密

    使用Z3破解简单的XOR加密 翻译:无名侠 原文地址: https://yurichev.com/blog/XOR_Z3/ 如果我们有一段用简单XOR加密过的文本,怎么寻找密钥呢?密钥的长度可能很长, ...

  6. Log4Net记录到MySql

    1.新建控制台程序. 2.添加Log4Net nuget 3.添加MySql 引用 4.添加配置文件如下: <?xml version="1.0"?> <conf ...

  7. 福建百度seo和推广,关键词排名优化,网络营销推广培训

    福建百度seo和推广,关键词排名优化,网络营销推广培训 福建百度seo和推广,关键词排名优化,网络营销推广培训,那么如何才能够让自己的文章信息被百度收录呢?只要说自己的文章能够被百度收录,那么你的信息 ...

  8. 插上腾飞的翅膀:为asp.net core添加protobuf支持

    没时间解释了,快上车. 通过NuGet获取Zaabee.AspNetCoreProtobuf Install-Package Zaabee.AspNetCoreProtobuf 在Startup.cs ...

  9. 多路复用select

    多路复用I/O:一个执行体监视多个文件描述符对象的状态是否改变,一旦改变通知其他执行体来实现. 基本思想: 1. 先构造一张有关描述符的表,然后调用一个函数,当这些文件描述符中的一个或者多个已准备好进 ...

  10. typedef struct 的用法

    typedef struct stu { int age; char name[20]; }stu,*pstu; stu stu1;相当于struct stu stu1; pstu pstu1;相当于 ...