TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码
距离上次学Python写的Python实现简单聊天室已经过去好久了,现在学c++又写了一遍,其实过程差不多,无非是语法的变化,目前仅实现最简单的一对一的通信,然后改就是了,接下来应该是多线程了,话不多说直接贴上源码;
一、服务端源码
#include <stdio.h>
#include <arpa/inet.h>
// #include <sys/types.h>
// #include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(){
//1、socket
int sfd = socket(AF_INET, SOCK_STREAM, 0);
if (sfd == -1){
perror("socket");
exit(-1);
}
// 2、bind ip and port
struct sockaddr_in saddr; //专用socket地址
saddr.sin_family = PF_INET;//协议族,ipv4的AF_INET也可以
// inet_pton(AF_INET, "192.168.193.128", saddr.sin_addr.s_addr);
saddr.sin_addr.s_addr = INADDR_ANY; // 监听所有外网接口, INADDR_ANY = 0
saddr.sin_port = htons(9999);//绑定的服务端口9999
int ret = bind(sfd, (struct sockaddr *)&saddr, sizeof(saddr));
if (ret == -1){
perror("bind");
exit(-1);
}
// 3、listen
ret = listen(sfd, 128);
if (ret == -1){
perror("listen");
exit(-1);
}
// 4、accept
struct sockaddr_in client_addr;
socklen_t addrlen = sizeof(client_addr);//客户端socket地址的大小
int newfd = accept(sfd, (struct sockaddr *)&client_addr, &addrlen);
if (newfd == -1){
perror("accept");
exit(-1);
}
// output connect message
char clientIP[16];
inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, clientIP, sizeof(clientIP));
unsigned short clientPort = ntohs(client_addr.sin_port);
printf("client %s:%d is connect. \n", clientIP, clientPort);
// 5、recv and send
char recvBuf[1024] = {0};
while(1){
memset(recvBuf, 0, sizeof(recvBuf)); //clear buffer
int num = read(newfd, recvBuf, sizeof(recvBuf));//read datas
if (num == -1){
perror("read");
exit(-1);
} else if (num > 0){
printf("client message : %s\n", recvBuf);
} else if (num == 0){
printf("server close.");
break;
}
char respondData[] = "Your message is receive,thanks!";
write(newfd, respondData, sizeof(respondData));
}
// 6、close
close(sfd);
close(newfd);
return 0;
}
二、客户端源码
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
// 1.创建套接字
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1) {
perror("socket");
exit(-1);
}
// 2.连接服务器端
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
inet_pton(AF_INET, "192.168.223.128", &serveraddr.sin_addr.s_addr);
serveraddr.sin_port = htons(9999);
int ret = connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
if(ret == -1) {
perror("connect");
exit(-1);
}
// 3. 通信
char recvBuf[1024] = {0};
char client_data[1024];// 从键盘输入,给客户端发送数据
while(1) {
memset(client_data, 0, sizeof(client_data));
printf("请输入发送数据:");
scanf("%s", client_data);
write(fd, client_data, strlen(client_data));
sleep(1);
int ret = read(fd, recvBuf, sizeof(recvBuf));
if(ret == -1) {
perror("read");
exit(-1);
} else if(ret > 0) {
printf("server message : %s\n", recvBuf);
} else if(ret == 0) {
printf("server closed...\n");
break;
}
}
// 关闭连接
close(fd);
return 0;
}
三、效果
服务端:

客户端:

TCP通信聊天服务端和客户端(C/C++语言开发)附完整源码的更多相关文章
- QTcpSocket-Qt使用Tcp通讯实现服务端和客户端
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTcpSocket-Qt使用Tcp通讯实现服务端和客户端 本文地址:https:// ...
- TCP中的服务端与客户端的实现
TCP中首先要在服务端开启监听,这样才可以从客户端链接 using System; using System.Collections.Generic; using System.Linq; using ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
[转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...
- 使用WebSocket实现服务端和客户端的通信
开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...
- Netty 学习(二):服务端与客户端通信
Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...
- (C#:Socket)简单的服务端与客户端通信。
要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...
- vertx 从Tcp服务端和客户端开始翻译
写TCP 服务器和客户端 vert.x能够使你很容易写出非阻塞的TCP客户端和服务器 创建一个TCP服务 最简单的创建TCP服务的方法是使用默认的配置:如下 NetServer server = ve ...
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
随机推荐
- mac新仙剑奇侠传 2018
新仙剑奇侠传 201803重制 下载,挂载后,拖动app到applications应用程序 文件夹即可. https://590m.com/f/28636472-500476381-5c8846 (访 ...
- hashtable被弃用了
Hashtable的作者:HashMap的作者:Hash Map的作者比Hashtable的作者多了著名顶顶的并发大神Doug Lea.他写了util.concurrent包.著有并发编程圣经Co ...
- 为知笔记快速隐藏左侧 快捷键 Esc
为知笔记快速隐藏左侧 快捷键 Esc
- C# 读取Xml文件中的中文
这是.xml中的内容 <?xml version="1.0" encoding="utf-8"?> <resources> <!- ...
- Java根据经纬度计算两点之间的距离
public final class DistanceUtils { /** * 地球半径,单位 km */ private static final double EARTH_RADIUS = 63 ...
- JavaScript基础知识整理(变量)
变量 ECMAScript变量有两种不同数据类型的值,分别是基本类型和引用类型,两者的不同在于基本类型值是简单的数据段,引用类型值一般指由多个值构成的对象 基本类型 基本数据类型包括5种:Undefi ...
- BASE64编码作业
BASE64编码作业 什么是BASE64编码 ase64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RF ...
- 机器学习之pandas介绍
pandas简介 pandas全称python Data Analysis Library,是基于numpy的一种工具,pandas纳入了大量库和一些标准的数据模型,提供了高效的操作大型数据集所需的工 ...
- defer和async区别
浏览器会立即加载JS文件并执行指定的脚本,"立即"指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行 加上async属性,加载 ...
- freeswitch开启https,wss
1.sip.js配置访问wss://域名:7443 2.freeswitch配置certs,使用cat .pem .key >wss.pem,合成wss证书.需重启freeswitch 3. ...