tcp client和tcp server的区别

tcp client和tcp server的区别,第1张

1、TCP和UDP都属于socket通信协议,前者是以100个数据流的方式进行通信,后者是以数据包的方式进行通信。

2、TCP是有向连接协议,UDP是无向连接协议。

3、当tcpclient和服务器建立连接时,它们需要三个握手协议。UDP不需要握手,直接发送数据包。

4、TCP通信不会丢失数据,UDP通信会丢失数据包。

5、在通信可靠性方面,TCP比UDP更可靠。

6、安全性上,TCP安全保密要比UDP高。

7、TServerSocket/TClientSocket,是兼容的消息通知的非阻塞异步模式。

扩展资料:

在使用TCP通讯建立连接时采用客户端服务器模式,这种模式又常常被称为主从式架构,简称为C/S结构,属于一种网络通讯架构,将通讯的双方以客户端(Client )与服务器 (Server) 的身份区分开来。

使用C/S结构的通信常见的还有S7通信, ISO-on-TCP通信。

服务器的特征:被动角色,等待来自客户端的连接请求,处理请求并回传结果。

客户端的特征:主动角色,发送连接请求,等待服务器的响应。

基于tcp编写的服务器可以用循环的方式实现多个客户端的连接。根据查询相关公开资料,基于TCP的服务器可以用循环来实现多个客户端的连接,这样,当有新的客户端连接到服务器时,服务器就可以不停地检测连接,及时将新连接加入到客户端列表中。此外,服务器可以使用某种数据结构(如队列)来存储客户端的连接。

该服务器完成将客户端发送的内容转换成大写,并发送到客户端(注意:服务器只支持一个客户端连接,后面我们会使用多进程,多线程,select,poll,epoll来完善我们的服务器,使之支持多个客户端连接)

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#include <ctype.h>

#define SERV_PORT 7000

//running command: "./server_tcp -p 7001"

int main(int argc, char** argv)

{

        int opt

        int port = SERV_PORT

        while((opt = getopt(argc, argv, "p:")) != -1){

            switch (opt){

              case 'p': port = atoi(optarg)

                      break

              default: break

            }

        }

        struct sockaddr_in serv_addr, clnt_addr

        socklen_t clnt_len

        int lfd, cfd

        int n, i

        char buf[BUFSIZ]

        lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

        if(lfd <0){

                printf("%s\n", "socket error")

                exit(1)

        }

        serv_addr.sin_family = AF_INET

        serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")

        serv_addr.sin_port = htons(port)

        bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))

        listen(lfd, 128)

        clnt_len = sizeof(serv_addr)

        cfd = accept(lfd, (struct sockaddr*)&clnt_addr, &clnt_len)

        if(cfd == -1){

            printf("accept error\n")

            if(errno == EAGAIN || errno == EWOULDBLOCK){

                    printf("normal error")

            }else{

                printf("innormal error\n")

                return -1

            }

        }

        while(1){

          n = read(cfd, buf, BUFSIZ)

          if(n >0){

                printf("receive centent: %s\n", buf)

                for(i = 0i <ni++){

                        buf[i] = toupper(buf[i])

                }

          }

          write(cfd, buf, n)

        }

        close(cfd)

        close(lfd)

        return 0

}

客户端可以省略,使用nc命令可以模拟客户端连接: nc 127.1 7001

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

int main()

{

struct sockaddr_in serv_addr

int lfd

lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

serv_addr.sin_family = AF_INET

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//服务器和客户端IP相同

serv_addr.sin_port = htons(6666)

connect(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))

write(lfd, "hello socket", strlen("hello socket"))

char rbuf[BUFSIZ]

read(lfd, rbuf, BUFSIZ)

printf("rbuf=%s\n", rbuf)

close(lfd)

return 0

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/180092.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存