Socket网络编程(TCP/IP)实现服务器/客户端通信。

这篇具有很好参考价值的文章主要介绍了Socket网络编程(TCP/IP)实现服务器/客户端通信。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.前言

回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。

那不同主机间该怎么通信呢?

可以使用Socket编程来实现。

Socket编程可以通过网络来实现实现不同主机之间的通讯。

二.Socket编程的网络模型如下。

Socket网络编程(TCP/IP)实现服务器/客户端通信。

1.创建socket

创建通讯套接字

int socket(int domain, int type, int protocol);
//参数一:是通信时候用的协议族
// AF_UNIX, AF_LOCAL      用于本地进程/线程的网络通信
//AF_INET                 用于IPV4的网络通信
//AF_INET6                用于IPV6的网络通信
//参数二:为sockt的类型
//SOCK_STREAM             流水式socket,对应的是TCP
//SOCK_DGRAM              数据报式socket 对应的是UDP
//参数三:通常填零

3.绑定socket/端口号

绑定IP地址端口号等。

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//参数一:为创建socket返回的标识符
//参数二:为一个struct sockaddr *addr的指针结构体,里面包含了,IP地址和端口号,网络编程是一般使用的是struct sockaddr_in类型的。
// struct sockaddr_in 
//   {       
//       u_short sin_family;      // 地址族, AF_INET   
//       u_short sin_port;        // 端口号 
//      struct in_addr sin_addr; // IPV4地址      
//   char sin_zero[8];        // 8 bytes unused,作为填充
//    }; 
//如果使用了struct sockaddr_in类型的,左后一定要强转成struct sockaddr *addr类型的。
//参数三:为大小,sizeof

4.监听端口号

函数原型如下

 int listen(int sockfd, int backlog);
//参数一:为创建socket返回的文件描述符
//参数e二:为能

5.接受客户端的连接请求

程序运行后服务器会一直阻塞在这 等待客户端发送连接请求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//参数一:为创建socket返回的文件描述符
//参数二:struct sockaddr类型的指针,用来存放端口号和IP地址
//参数三:为大小sizeof

6.请求服务器连接(客户端)

向服务器发送连接请求。

 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//参数一:为创建socket返回的文件描述符
//参数二:struct sockaddr类型的指针,用来存放端口号和IP地址
//参数三:为结构体大小

7.读取/写入

连接成功后开始信息的交互,可以使用循环,让交互不退出去

 ssize_t read(int fd, void *buf, size_t count);
//参数一:文件描述符
//参数二:缓冲区
//参数san:读取的大小
ssize_t write(int fd, const void *buf, size_t count);
//参数与read出不多

8.关闭文件

通讯完毕,关闭文件

int close(int fd);
//参数:你要关闭哪个文件就写哪个文件的文件描述符

三.示例代码

1.server.c

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

int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    struct sockaddr_in addr2;
    memset(&addr,0,sizeof(struct sockaddr_in));
    memset(&addr2,0,sizeof(struct sockaddr_in));
    char *readbuf = (char *)malloc(sizeof(struct sockaddr_in)*10);
    char mas[128] ={0};
    int cockfd;
    int sockfd;
    int nread;
 
    if(argc != 3)//判断输入的参数是否等于3
    {
        printf("param not good\n");
        exit(-1);
    }
    
    
    if(sockfd = socket(AF_INET,SOCK_STREAM,0) == -1)//创建Socket,使用IPV4,TCP类型
    {
        printf("creat socket faild\n");
    }

    
    addr.sin_family = AF_INET;      // 地址族, AF_INET,2 bytes    
    addr.sin_port = htons(atoi(argv[2]));     // 端口,2 bytes        
    inet_aton(argv[1],&addr.sin_addr);//使用inet_aton函数将IP地址转换为网络序列。
    bind(sockfd,(struct sockaddr*)&addr,sizeof(sockaddr_in));

    listen(sockfd,10);//监听
    while(1)
    {
        //尝试连接
         cockfd = accept(sockfd,(struct sockaddr*)&addr2,sizeof(sockaddr_in));
         if(cockfd == -1)
         {
            perror("why");//失败打印原因。
         }
         printf("get conset :  %s\n",inet_nota(addr2.sin_addr));//打印连接成功的IP地址

        //创建进程,让同时维护,读和写
        if(fork() == 0)
        {
            while(1)
            {
                memset(readbuf,0,malloc_usable_size(readbuf))//每次通讯完成,内容置为0
                nread = read(cockfd,readbuf,malloc_usable_size(readbuf));//读取信息
                printf(" get message : %s\n",readbuf);//输出读取的内容
            }

            if(fork() == 0)子进程在创建一个子进程让同时运行读和写
            {
                while(1)
                {
                    memset(msg,0,sizeof(msg));//每次运行前把数组初始化
                    printf("please input\n");
                    gets(msg);//获取信息       
                    write(cockfd,msg,strlen(msg));写入信息
                }
            }
         }
    }
    return 0;   
}

示例代码

2.client.c

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

int main(int argc,char *argv[])
{
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(struct sockaddr_in));
    char *readbuf = (char *)malloc(sizeof(struct sockaddr_in)*10);
    char mas[128] ={0};
    int cockfd;
    int sockfd;
    int nread;
 
    if(argc != 3)
    {
        printf("param not good\n");
        exit(-1);
    }
    
    
    ifcockfd = socket(AF_INET,SOCK_STREAM,0) == -1)
    {
        printf("creat socket faild\n");
    }

    
    addr.sin_family = AF_INET;      // 地址族, AF_INET,2 bytes    
    addr.sin_port = htons(atoi(argv[2]));     // 端口,2 bytes        
    inet_aton(argv[1],&addr.sin_addr);//使用inet_aton函数将IP地址转换为网络序列。
   
    connect(cockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr));//请求连接
    while(1)/
    {   
        if(fork() == 0)//创建进程,同时维护读写
        {
            while(1)
            {
                memset(readbuf,0,malloc_usable_size(readbuf))
                nread = read(cockfd,readbuf,malloc_usable_size(readbuf));//读取内容
                printf(" get message : %s\n",readbuf);//打印读取到的内容
            }

            if(fork() == 0)
            {
                while(1)
                {
                    memset(msg,0,sizeof(msg));
                    printf("please input\n");
                    gets(msg);    //获取信息   
                    write(cockfd,msg,strlen(msg));//写入信息
                }
            }
         }
    }
    return 0;   
}

以上就是我这段时间以来对网络编程的学习和理解,顺便记录一下,希望对你们会有所帮助,如果有不对的地方,欢迎大家来指导,谢谢文章来源地址https://www.toymoban.com/news/detail-476015.html

到了这里,关于Socket网络编程(TCP/IP)实现服务器/客户端通信。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

    目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 运行结果:

    2024年02月10日
    浏览(36)
  • 【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

    TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示\\\"TCP数据报\\\"因为TCP不是以数据报为单位进行传输的.是以字节的方式,流式传输 ServerSocket API ServerSocket 是专门给服务器使用的Socket对象. ServerSocket 构造方法: ServerSocket(int port) 创建一个服务端流套接字Socket,并绑

    2024年02月12日
    浏览(38)
  • TCP IP网络编程(四) 基于TCP的服务器端、客户端

    TCP/IP协议栈 ​ TCP/IP协议栈 TCP/IP协议栈共分为4层,可以理解为数据收发分成了4个层次化过程。 ​ TCP协议栈 ​ UDP协议栈 链路层 链路层是物理连接领域标准化的结果,也是最基本的领域,专门定义LAN、WAN、MAN等网络标准。两台主机通过网络进行数据交换,这需要像下图所示

    2024年01月16日
    浏览(33)
  • TCP IP网络编程(五) 基于TCP的服务器端、客户端 (补充)

    回声客户端出现的问题 在上一节基于TCP的服务器端、回声客户端中,存在问题: 如果数据太大,操作系统就有可能把数据分成多个数据包发送到客户端,客户端有可能在尚未收到全部数据包时就调用read函数 问题出在客户端,而不是服务器端,先来对比一下客户端与服务器端

    2024年02月09日
    浏览(41)
  • 《TCP/IP网络编程》阅读笔记--基于TCP的服务器端/客户端

    目录 1--TCP/IP协议栈 2--TCP服务器端默认函数调用顺序 3--TCP客户端的默认函数调用顺序 4--Linux实现迭代回声服务器端/客户端 5--Windows实现迭代回声服务器端/客户端 6--TCP原理 7--Windows实现计算器服务器端/客户端         TCP/IP协议栈共分 4 层,可以理解为数据收发分成了 4 个层

    2024年02月10日
    浏览(32)
  • python网络编程:通过socket实现TCP客户端和服务端

    目录 写在开头 socket服务端(基础) socket客户端(基础) 服务端实现(可连接多个客户端)  客户端实现 数据收发效果   近期可能会用python实现一些网络安全工具,涉及到许多关于网络的知识,逃不过的就是最基本的socket。本文将介绍如何通过python自带的socket库实现TCP客户

    2024年03月21日
    浏览(34)
  • 《TCP/IP网络编程》阅读笔记--基于UDP的服务器端/客户端

    目录 1--TCP和UDP的主要区别 2--基于 UDP 的数据 I/O 函数 3--基于 UDP 的回声服务器端/客户端 4--UDP客户端Socket的地址分配 5--UDP存在数据边界 6--UDP已连接与未连接的设置 ① TCP 提供的是可靠数据传输服务,而 UDP 提供的是不可靠数据传输服务; ② UDP 在结构上比 TCP 更简洁,其不会

    2024年02月09日
    浏览(42)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(43)
  • Linux网络编程:Socket服务器和客户端实现双方通信

    目录 一,什么是网络编程 二,为什么使用端口号 三,TCP协议与UDP协议 ①TCP(传输控制协议) ②UDP(用户数据报协议,User Data Protocol) ③总结归纳 四,Socket服务器和客户端的开发流程 五,服务器和客户端相关API说明 ①socket()函数 ②bind()函数 ③listen()函数 ④accept()函数 ⑤客户端

    2024年02月11日
    浏览(44)
  • TCP/IP(十一)TCP的连接管理(八)socket网络编程

    一  socket网络编程  socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close ①  针对 TCP 应该如何 Socket 编程? ②   listen 时候参数 backlog 的意义? ③  accept 发生在三次握手的哪一步? ④   客户端调用 close 了,连接是断开的流程是什么? ⑤  没有 accept,能建立 T

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包