linux下TCP/IP实现简单聊天程序

2024-09-08 08:08

本文主要是介绍linux下TCP/IP实现简单聊天程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。

服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。


服务器端:


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <arpa/inet.h>#define MAXBUF 1024int main(int argc, char *argv[])
{int pid;	int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];if (argv[2])myport = atoi(argv[2]);elsemyport = 7575;if (argv[3])lisnum = atoi(argv[3]);elselisnum = 5;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket");exit(EXIT_FAILURE);}bzero(&my_addr, sizeof(my_addr));my_addr.sin_family = AF_INET;my_addr.sin_port = htons(myport);if (argv[1])my_addr.sin_addr.s_addr = inet_addr(argv[1]);elsemy_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))== -1) {perror("bind");exit(EXIT_FAILURE);}if (listen(sockfd,lisnum ) == -1) {perror("listen");exit(EXIT_FAILURE);}printf("wait for connect\n");	len = sizeof(struct sockaddr);if ((new_fd =accept(sockfd, (struct sockaddr *) &their_addr,&len)) == -1) {perror("accept");exit(EXIT_FAILURE);} elseprintf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port), new_fd);if(-1==(pid=fork()))	{perror("fork");exit(EXIT_FAILURE);}else if( pid == 0){while (1) {bzero(buf, MAXBUF + 1);printf("input the message to send:");fgets(buf, MAXBUF, stdin);if (!strncasecmp(buf, "quit", 4)) {printf("i will close the connect!\n");break;}len = send(new_fd, buf, strlen(buf) - 1, 0);if (len < 0){printf("message'%s' send failure!errno code is %d,errno message is '%s'\n",buf, errno, strerror(errno));break;}}}else {	while(1){bzero(buf, MAXBUF + 1);len = recv(new_fd, buf, MAXBUF, 0);if (len > 0)printf("message recv successful :'%s',%dByte recv\n",buf, len);else if (len < 0){printf("recv failure!errno code is %d,errno message is '%s'\n",errno, strerror(errno));break;}else{printf("the other one close quit\n");break;}}}close(new_fd);close(sockfd);return 0;
}



客户端:


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>#define MAXBUF 1024int main(int argc, char **argv)
{int sockfd, len;struct sockaddr_in dest;char buffer[MAXBUF + 1];if (argc != 3) {printf(" error format,it must be:\n\t\t%s IP port\n",argv[0]);exit(EXIT_FAILURE);}if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket");exit(errno);}printf("socket created\n");bzero(&dest, sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(atoi(argv[2]));if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) {perror(argv[1]);	exit(errno);}if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest))==-1) {perror("Connect ");exit(errno);}printf("server connected\n");pid_t pid;if(-1==(pid=fork())){perror("fork");exit(EXIT_FAILURE);}else if (pid==0){while (1) {bzero(buffer, MAXBUF + 1);len = recv(sockfd, buffer, MAXBUF, 0);if (len > 0)printf("recv successful:'%s',%d byte recv\n",buffer, len);else if(len < 0){perror("recv");break;}else{printf("the other one close ,quit\n");break;}}	}else{while (1) {bzero(buffer, MAXBUF + 1);printf("pls send message to send:");fgets(buffer, MAXBUF, stdin);if (!strncasecmp(buffer, "quit", 4)) {printf(" i will quit!\n");break;}len = send(sockfd, buffer, strlen(buffer) - 1, 0);if (len < 0) {perror("send");break;}}}close(sockfd);return 0;
}



服务器端执行 :           ./s 192.168.142.132 7575 5


客户端执行:               ./c 192.168.142.132 7575


其中,192.168.142.132是本机的IP地址.


服务器端信息:

root@jieniyimiao-virtual-machine:/home/jieniyimiao/c_code/linux/ch13/sock_tcp_p_p_chat# ./s 192.168.142.132 7575 5
wait for connect
server: got connection from 192.168.142.132, port 44698, socket 4
input the message to send:jieniyimiap
input the message to send:ddddddddddddddddddddddddddd
input the message to send:dddddddddddddddddddddddddddd
input the message to send:aaaaaaaaaaaaaaaaaaaaaa
input the message to send:aaaaaaaaaaaaaaaaaaaaaaaa
input the message to send:message recv successful :'dddddddddddddddddd',18Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
message recv successful :'ddddddddddddddd',15Byte recv
message recv successful :'ddddddddddddddddd',17Byte recv
message recv successful :'dddddddddddddd',14Byte recv
quit
i will close the connect!


客户端略:



用NETSTAT查看信息如下:

# netstat |grep 192.168.142.132

**********************************************************************************
tcp        0      0 192.168.142.132:7575    192.168.142.132:44698   ****

tcp        0      0 192.168.142.132:44698   192.168.142.132:7575    ****










这篇关于linux下TCP/IP实现简单聊天程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1147570

相关文章

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法