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日
    浏览(51)
  • 网络编程3——TCP Socket实现的客户端服务器通信完整代码(详细注释帮你快速理解)

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(49)
  • 《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日
    浏览(43)
  • 网络编程——socket服务端和客户端(TCP)

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

    2024年02月07日
    浏览(34)
  • 【网络编程】实现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日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包