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)接收 ...
随机推荐
- C#使用SharpZipLib解压多文件的zip压缩文件数据流,保存到本地
代码: public async Task<ReturnModel<List<string>>> UploadModel() { var task = new Ta ...
- web server 接口调用
1. 生成客户端代码 2.调用接口 import javax.xml.ws.Service;public static NotificationServiceDevImplPortType mokaA ...
- ping 请求找不到主机 www.baidu.com
1.以管理员方式运行cmd 2.输入netsh winsock reset 3.重启电脑 4.如果还是不行,就删除C:\Windows\System32\drivers\etc里面的hosts文件试试 ...
- MySQL 【CAST】函数,类型转换使用
Cast(字段名 as 转换的类型 ),其中类型可以为: 1.CHAR[(N)] 字符型 2.DATE 日期型3.DATETIME 日期和时间型4.DECIMAL float型5.SIGNED int ...
- Python使用requests和requests_toolbelt上传文件
1.requests-toolbelt官方文档:https://pypi.org/project/requests-toolbelt/ 2.环境安装 pip install requests-tool ...
- mysql 设置外键约束SET FOREIGN_KEY_CHECKS=1
问题描述:Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法: 在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sq ...
- Mybatis配置报错:Failed to configure a DataSource: 'url' attribute is not specified and no embe...
问题分析及解决方案 问题原因: Mybatis没有找到合适的加载类,其实是大部分spring - datasource - url没有加载成功,分析原因如下所示. DataSourceAutoConf ...
- modbus_tk Rru
import serialimport structimport loggingimport modbus_tkimport modbus_tk.defines as cstimport modbus ...
- Codeforces Round #843 (Div. 2) Problem C
C. Interesting Sequence time limit per test 1 second memory limit per test 256 megabytes input stand ...
- axios使用总结
一.请求配置 // 引入import axios from 'axios';import qs from 'qs';this.$axios({ method:"get", // g ...