TCP通信—客户端与客户端的双向通信

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

功能:

1.实现客户端与客户端之间的TCP双向通信;

2.服务器记录客户端实名连接,并显示客户端数据记录;

3.客户端退出,服务器和另一客户端显示相应提示;

服务器代码思路:

1.定义数组保存客户端文件描述符;

2.主程序负责接收客户端1的数据发送给客户端2;

3.开展一个线程负责接收到客户端2的信息发送给客户端1;

客户端代码思路:

1.建立socket连接

2.绑定IP和端口号

3.主动连接服务器

4.植入线程--TCP接收数据

5.TCP发送数据

服务器代码:

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

//定义客户端结构体
struct sockaddr_in client;

int sockfd;
int arr_fd[2];	//客户端文件描述符
char arr_ip[2][20];	//客户端IP数组

//TCP接收客户端2数据发送客户端1
void *show(void *arg){
    char buf[50];
    char buff[30] = "对方客户端已关闭!\n";
    while(1){
	bzero(buf,sizeof(buf));
	int ret = recv(arr_fd[1],buf,sizeof(buf),0);
	if(ret == 0 || ret < 0)//接收方向是客户端2的arr_fd
	{
	    sleep(1);
	    close(sockfd);
	    send(arr_fd[0],buff,sizeof(buff),0);
	    printf("客户端 %s 已关闭\n", arr_ip[1]);
	    break;
	}else if(ret < 0 || errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN){
	    continue;
	}
	send(arr_fd[0],buf,sizeof(buf),0);//向客户端1的arr_fd发送数据
	printf("客户端%s:%s\n",arr_ip[1],buf);
    }
}

int main(void)
{
    //建立socket连接
    sockfd=socket(AF_INET,SOCK_STREAM,0);//IPV4   TCP   0:前两个参生效
    if(sockfd<0){
	perror("socket");
	return -1;
    }
    printf("sockfd:%d\n",sockfd);    
    
    //声明服务器结构体
    struct sockaddr_in server;
    server.sin_family=AF_INET;//地址族  代表选择IPv4
    server.sin_port=htons(10086);//端口号 //因为有大小端序之分,所以要转换端序
    server.sin_addr.s_addr=inet_addr("192.168.90.116");//IP地址 点分十进制转化网络二进制
    
    //绑定IP和端口号
    if(bind(sockfd,(struct sockaddr *)&server,sizeof(server))){
	perror("bind");
	return -1;
    }

    //监听			
    listen(sockfd,8);

    //等待客户端连接
    int len = sizeof(client), i = 0;
    for(int i = 0; i < 2; i++){
	arr_fd[i] = accept(sockfd,(struct sockaddr *)&client,&len);
	if(arr_fd[i] < 0){
	    perror("accept");
	    return -1;
	}
	printf("客户%d上线\n",arr_fd[i]);
	strcpy(arr_ip[i],inet_ntoa(client.sin_addr));
	printf("其IP:%s PORT:%d\n",arr_ip[i],ntohs(client.sin_port));
    }

    //植入线程
	pthread_t tid2;
	pthread_create(&tid2,NULL,show,NULL);
	pthread_detach(tid2);//线程收尸

    //TCP接收客户端1数据发送客户端2
    char buf[50];
    char buff[30] = "对方客户端已关闭!\n";
    while(1){
	bzero(buf,sizeof(buf));
	int ret = recv(arr_fd[0],buf,sizeof(buf),0);
	if(ret == 0)//接收方向是客户端1的arr_fd
	{
	    sleep(1);
	    close(sockfd);
	    send(arr_fd[1], buff, sizeof(buff), 0);
	    printf("客户端 %s 已关闭\n", arr_ip[0]);
	    break;
	}else if(ret < 0 || errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN){
	    continue;
	}
	
	send(arr_fd[1],buf,sizeof(buf),0);//向客户端2的arr_fd发送数据
	printf("客户端%s:%s\n",arr_ip[0],buf);
    }

    return 0;
}

客户端代码:

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

//实现双向通信	---线程
int fd;
void *show(void *arg){
    //接收
    int sockfd = *(int *)arg;
    char buf[50];
    while(1){
	bzero(buf, sizeof(buf));
	recv(sockfd,buf,sizeof(buf),0);
	printf("服务器: %s \n",buf);
    }
}

int main(void)
{
    //1.建立socket连接
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);//IPv4
    if(sockfd < 0){
	perror("socket");
	return -1;
    }
    printf("sockfd = %d\n", sockfd);

    //2.绑定IP和端口号
    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(10086);
    server.sin_addr.s_addr = inet_addr("192.168.90.116");

    //3.主动连接
    if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))){
	perror("socket");
	return -1;
    }

    //植入线程
    pthread_t tid;
    pthread_create(&tid, NULL, show, &sockfd);

    //5.TCP发送
    char buf[50];
    while(1){
	bzero(buf, sizeof(buf));
	scanf("%s", buf);
	send(sockfd,buf,sizeof(buf),0);
    }

    return 0;
}

运行结果:

客户端和客户端通信tcp,网络编程,tcp/ip,网络,服务器,vim,linux

 文章来源地址https://www.toymoban.com/news/detail-614740.html

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

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

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

相关文章

  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

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

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

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

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

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

    2024年02月05日
    浏览(64)
  • AI对话交互场景使用WebSocket建立H5客户端和服务端的信息实时双向通信

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许 服务端主动向客户端推送数据 。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HT

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

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

    2024年01月16日
    浏览(55)
  • 网络编程:编写一个TCP客户端与服务端

    用的系统是Ubuntu。 socket用来创建套接字。这个函数服务端与客户端都要使用。 第一个参数用来制定地址族规范,比如 AF_INET(PF_INET) 表示IPv4地址, AF_INET6(PF_INET6) 表示IPv6地址。 第二个参数用来制定套接字的类型规范,如 SOCK_STREAM 表示面向连接的套接字, SOCK_DGRAM 表示面

    2024年02月01日
    浏览(47)
  • 《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日
    浏览(64)
  • TCP IP网络编程(五) 基于TCP的服务器端、客户端 (补充)

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

    2024年02月09日
    浏览(67)
  • 【网络编程】实现UDP/TCP客户端、服务器

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、UDP 1、Linux客户端、服务器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客户端 二、T

    2024年02月06日
    浏览(61)
  • ESP32网络编程-TCP客户端数据传输

    本文将详细介绍在Arduino开发环境中,实现一个ESP32 TCP客户端,从而达到与TCP服务器数据交换的目标。 Internet 协议(IP)是 Internet 的地址系统,具有将数据包从源设备传递到目标设备的核心功能。IP 是建立网络连接的主要方式,奠定了 Internet 的基础。IP 不负责数据包排序或错

    2024年02月03日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包