网络编程——socket服务端和客户端(TCP)

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

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 [1]  。

套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信 [3]  。

Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。 Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制 [2]  。

TCP/IP 是互联网的基础, TCP代表传输控制协议,IP代表互联网协议。目前有两个版本IP,一个是32位地址的IPv4 和一个是128位的 IPv6 。而IPv4 是现如今使用最多的IP版本,也是这次讨论的重点。

TCP/UDP对比

1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前       不需  要建立连接

2.  TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

3.  TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4.  每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5.  TCP首部开销20字节;UDP的首部开销小,只有8个字节

6.  TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

端口号作用

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等

这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。

实际上是通过“IP地址+端口号”来区 分不同的服务的。

端口提供了一种访问通道,

服务器一般都是通过知名端口号来识别的。例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69

字节序

字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
1. 小端字节序Little endian:将低序字节存储在起始地址
2. 网络字节序、大端字节序Big endian:将高序字节存储在起始地址

字节序转换api

htons的功能:将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)

#include <netinet/in.h>

uint16_t htons(uint16_t host16bitvalue);    //返回网络字节序的值
uint32_t htonl(uint32_t host32bitvalue);    //返回网络字节序的值
uint16_t ntohs(uint16_t net16bitvalue);     //返回主机字节序的值
uint32_t ntohl(uint32_t net32bitvalue);     //返回主机字节序的值

h代表host,n代表net,s代表short(两个字节),l代表long(4个字节),
通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。
有时可以用INADDR_ANY,INADDR_ANY指定地址让操作系统自己获取

Sockt服务器和客户端的开发步骤(TCP)

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

服务端:

1.创建套接字

int socket(int domain, int type, int protocol);int socket(int domain, int type, int protocol);

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

2.为套接字添加信息

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

地址转换API:

inet_aton是一个计算机函数,功能是将一个字符串IP地址转换为一个32位的网络序列IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。使用这个函数并没有错误码存放在errno中,所以它的值会被忽略。

int inet_aton(const char* straddr,struct in_addr *addrp);
参数描述:
1 输入参数string包含ASCII表示的IP地址。
2 输出参数addr是将要用新的IP地址更新的结构。

把字符串形式的“192.168.1.123”转为网络能识别的格式

char* inet_ntoa(struct in_addr inaddr);

把网络格式的ip地址转为字符串形式

3.监听网络连接

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

4.监听到有客户端接入,接受一个连接

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

5.数据交互

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

 6.关闭套接字,断开连接

服务端代码实现一:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
        int s_fd;

        //1.socket
        //int socket(int domain, int type, int protocol);
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }

        struct sockaddr_in s_addr;
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8888);

        //int inet_aton(const char *cp, struct in_addr *inp);
        inet_aton ("192.168.193.128",&s_addr.sin_addr);
        //inet_aton ("127.0.0.1",&s_addr.sin_addr);

        //2.bind
        //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen
        //int listen(int sockfd, int backlog);
        listen(s_fd,10);

        //4.accept
        //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 

        int c_fd = accept(s_fd,NULL,NULL);

        //5.read

        //6.write
        printf("connect success\n");

        while(1);

        return 0;
}

与window端连接结果

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

服务端代码实现二:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
        int s_fd;
        int n_read;
        char readBuf[128];
        char *msg = "I get your connet";

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        //int socket(int domain, int type, int protocol);
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8888);

        //int inet_aton(const char *cp, struct in_addr *inp);
        //inet_aton ("192.168.193.128",&s_addr.sin_addr);
        inet_aton ("127.0.0.1",&s_addr.sin_addr);

        //2.bind
        //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen
        //int listen(int sockfd, int backlog);
        listen(s_fd,10);

        //4.accept
        //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 
        int clen = sizeof(struct sockaddr_in);

        int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd==-1){

                perror("accept");
        }

        printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));

        //5.read
        n_read = read(c_fd,readBuf,128);
        if(n_read ==-1){
                perror("read");
        }else{
                printf("get message:%d,%s\n",n_read,readBuf);
        }


        //6.write
        write(c_fd,msg,strlen(msg));

        //printf("connect\n");
        //while(1);



        return 0;
}

连接运行: socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

 客户端connect函数:

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言初步实现服务端与客户端通信代码:

 server.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
        int s_fd;
        int n_read;
        char readBuf[128];
        char *msg = "I get your connet";

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        //int socket(int domain, int type, int protocol);
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8888);

        //int inet_aton(const char *cp, struct in_addr *inp);
        //inet_aton ("192.168.193.128",&s_addr.sin_addr);
        inet_aton ("127.0.0.1",&s_addr.sin_addr);

        //2.bind
        //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen
        //int listen(int sockfd, int backlog);
        listen(s_fd,10);

        //4.accept
        //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 
        int clen = sizeof(struct sockaddr_in);

        int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd==-1){

                perror("accept");
        }

        printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));

        //5.read
        n_read = read(c_fd,readBuf,128);
        if(n_read ==-1){
                perror("read");
        }else{
                printf("get message:%d,%s\n",n_read,readBuf);
        }


        //6.write
        write(c_fd,msg,strlen(msg));

        //printf("connect\n");
        //while(1);



        return 0;
}
  

client.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
        int c_fd;
        int n_read;
        char readBuf[128];
        char *msg = "msg from client";

        struct sockaddr_in c_addr;

        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        //int socket(int domain, int type, int protocol);
        c_fd = socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
                perror("socket");
                exit(-1);
        }

        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(8888);

        //int inet_aton(const char *cp, struct in_addr *inp);
        //inet_aton ("192.168.193.128",&s_addr.sin_addr);
        inet_aton ("127.0.0.1",&c_addr.sin_addr);

        //2.connect
        //int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1){
                perror("connect");
                exit(-1);
        }
        //3.send

        write(c_fd,msg,strlen(msg));

        //4.read
        n_read = read(c_fd,readBuf,128);
        if(n_read ==-1){
                perror("read");
        }else{
                printf("get message from server:%d,%s\n",n_read,readBuf);
        }


        return 0;
}

运行连接:

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言

 实现双方聊天代码:

server.c

  #include <stdio.h>
#include <sys/types.h>/* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc,char **argv)
{
        int s_fd;
        int c_fd;

        int n_read;
        char readBuf[128];
        char msg[128] = {0};

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        if(argc!=3){
                printf("param is not good\n");
                exit(-1);
        }

        memset(&s_addr,0,sizeof(struct sockaddr_in));
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket
        //int socket(int domain, int type, int protocol);
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd==-1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(atoi(argv[2]));

        //int inet_aton(const char *cp, struct in_addr *inp);
        //inet_aton ("192.168.193.128",&s_addr.sin_addr);
        inet_aton (argv[1],&s_addr.sin_addr);

        //2.bind
        //int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen
        //int listen(int sockfd, int backlog);
        listen(s_fd,10);

        //4.accept
        //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 
        int clen = sizeof(struct sockaddr_in);

        while(1){
                c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
                if(c_fd==-1){

                        perror("accept");
                }

                printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));

                if(fork()==0){
                        if(fork()==0){
                                while(1){

                                        memset(msg,0,sizeof(msg));
                                        printf("Iput: ");
                                        gets(msg);
                                        write(c_fd,msg,strlen(msg));
                                }
                        }
                        //5.read
                        while(1){
                                memset(readBuf,0,sizeof(readBuf));
                                n_read = read(c_fd,readBuf,128);
                                if(n_read ==-1){
                                        perror("read");
                                }else{
                                        printf("get message:%d,%s\n",n_read,readBuf);
                                }
                        }
                        break;
                }


        }



        return 0;
}

client.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc,char **argv)
{
        int c_fd;
        int n_read;
        char readBuf[128];
        char msg[128] = {0};

        struct sockaddr_in c_addr;

        memset(&c_addr,0,sizeof(struct sockaddr_in));

        if(argc!=3){
                printf("param is not good\n");
                exit(-1);
        }

        //1.socket
        //int socket(int domain, int type, int protocol);
        c_fd = socket(AF_INET,SOCK_STREAM,0);
        if(c_fd==-1){
                perror("socket");
                exit(-1);
        }

        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(atoi(argv[2]));

        //int inet_aton(const char *cp, struct in_addr *inp);
        //inet_aton ("192.168.193.128",&s_addr.sin_addr);
        inet_aton (argv[1],&c_addr.sin_addr);

        //2.connect
        //int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1){
                perror("connect");
                exit(-1);
        }
        while(1){

                if(fork()==0){
                        while(1){
                                memset(msg,0,sizeof(msg));
                                printf("input: ");
                                gets(msg);
                                write(c_fd,msg,strlen(msg));
                        }
                }
                while(1){
                        memset(readBuf,0,sizeof(readBuf));
                        n_read = read(c_fd,readBuf,128);
                        if(n_read == -1){
                                perror("read");
                        }else{
                                printf("get messgage from server : %d ,%s\n",n_read,readBuf);
                        }
                }

        }

        //3.send



        return 0;
}

socket客户端和服务端,Linux系统编程,网络,tcp/ip,网络协议,linux,c语言文章来源地址https://www.toymoban.com/news/detail-729182.html

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

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

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

相关文章

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

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(66)
  • Linux网络编程:Socket套接字编程(Server服务器 Client客户端)

    文章目录: 一:定义和流程分析 1.定义 2.流程分析  3.网络字节序 二:相关函数  IP地址转换函数inet_pton inet_ntop(本地字节序 网络字节序) socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结构(IP+port)) listen函数(设置最大连接数或者说能同时进行三次握手的最

    2024年02月12日
    浏览(62)
  • Linux下网络编程(3)——socket编程实战,如何构建一个服务器和客户端连接

            经过前几篇的介绍,本文我们将进行编程实战,实现一个简单地服务器和客户端应用程序。 编写服务器程序          编写服务器应用程序的流程如下:         ①、调用 socket()函数打开套接字,得到套接字描述符;         ②、调用 bind()函数将套接字

    2024年02月03日
    浏览(41)
  • Socket实例,实现多个客户端连接同一个服务端代码&TCP网络编程 ServerSocket和Socket实现多客户端聊天

    Java socket(套接字)通常也称作\\\"套接字\\\",用于描述ip地址和端口,是一个通信链的句柄。应用程序通常通过\\\"套接字\\\"向网络发出请求或者应答网络请求。 使用socket实现多个客户端和同一客户端通讯;首先客户端连接服务端发送一条消息,服务端接收到消息后进行处理,完成后再

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

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

    2024年02月17日
    浏览(49)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(42)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(30)
  • 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )

    Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ; 在 网络编程 中 , Socket 套接字 主要用于 客户端 与 服务器 之间的 通信 , 大部分 网络相关的应用程序 , 都使用到了 Socket 套接字技术 ; 套接字有两种类型 : 流套接字 : 提供了一个可

    2024年02月15日
    浏览(42)
  • 网络编程3——TCP Socket实现的客户端服务器通信完整代码(详细注释帮你快速理解)

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 今天分享的内容是TCP流套接字实现的客户端与服务器的通信,一定要理解 DatagramSocket,DatagramPacket 这两个类的作用以及方法

    2024年02月12日
    浏览(29)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包