当前位置: 首页 > news >正文

Linux TCP通信示例

TCP通信流程

server.h

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_LINE 100
/*  用于将大写字符转换为小写字符。参数为需要转换的字符串 */
void my_fun(char * p)
{
	if(p == NULL)				 /* 空串 */
		return;
	for (; *p != '\0'; p++)
		if(*p >= 'A' && *p <= 'Z') /* 判断字符并进行转换,也可以使用库函数 */
			*p = *p -'A' + 'a';
}
int main(void)
{
	struct sockaddr_in sin;
	struct sockaddr_in cin;
	int l_fd;
	int c_fd;
	socklen_t len;
	char buf[MAX_LINE];					/* 存储传送内容的缓冲区 */
	char addr_p[INET_ADDRSTRLEN];		/* 存储客户端地址的缓冲区 */
	int port = 8000;					/* 端口号,使用8000 */
	int n;								/* 读写字节数 */
	bzero(&sin, sizeof(sin));			/* 清空地址结构 */
	sin.sin_family = AF_INET;			/* 使用IPv4通信域 */
	sin.sin_addr.s_addr = INADDR_ANY;	/* 服务器可以接受任意地址 */
	sin.sin_port = htons(port);		/* 端口号转换为网络字节序 */
	l_fd = socket(AF_INET, SOCK_STREAM, 0); /* 创立套接字,使用TCP协议 */
	bind(l_fd, (struct sockaddr*) &sin, sizeof(sin)); /* 将地址和套接字绑定 */
	listen(l_fd, 10);						/* 开始监听连接请求 */
	printf("waiting ...\n");
	while(1){       /* 服务器程序多半是死循环 */
		            /* 接受连接请求,从此函数中返回后就可以开始通信了 */
		c_fd = accept(l_fd, (struct sockaddr*) &cin, &len); 
		n = read(c_fd, buf, MAX_LINE);	        /* 读取客户端传来的信息 */
		inet_ntop(AF_INET, &cin.sin_addr, addr_p, sizeof(addr_p));
											/* 将客户端地址转换为字符串 */
		printf("client IP is %s, port is %d\n", addr_p, ntohs(cin.sin_port)); 											/* 打印客户端地址和端口号 */
		printf("content is : %s\n", buf);	/* 打印客户端发送过来的字符串 */
		my_fun(buf);
		write(c_fd, buf, n);				/* 将转换后的字串发给客户端 */
		close(c_fd);			/* 通信结束,关闭套接字,准备下一次通信 */
	}
	if(close(l_fd) == -1){		/* 通信结束,关闭套接字,准备下一次通信 */
		perror("fail to close");
		exit(1);
	}
	return 0; 
}

client.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <strings.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_LINE 100
int main(int argc, char *argv[])
{
	struct sockaddr_in sin;	/* 服务器的地址 */
	char buf[MAX_LINE];
	int sfd;
	int port = 8000;
	char *str = "test sting";	/* 默认的字符串 */
	if (argc > 1) {
		str = argv[1];			/* 从命令行参数中取得用户输入的串 */
	}
	bzero(&sin, sizeof(sin));
	sin.sin_family = AF_INET;	/* 使用IPv4地址族 */
	/* 和本机通信,同一台主机担任服务器和客户端的角色 */
	inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr); 
	sin.sin_port = htons(port);        /* 端口号使用8000,必须和服务器端的一致才行 */
	sfd = socket(AF_INET, SOCK_STREAM, 0);	/* 创建套接字 */
	connect(sfd, (const struct sockaddr *)&sin, sizeof(sin));
										/* 主动连接服务器 */
	write(sfd, str, strlen(str) + 1); /* 发送字符串,该串包含‘\0’结束符 */
	/* 读取服务器程序发回的串,由于是同一台主机通信,不存在延时的问题。
	* 但是在真正的网络环境中,要处理读操作的延时问题。
	*/
	read(sfd, buf, MAX_LINE); 
	printf("recive from server: %s\n", buf); /* 打印该串 */
	close(sfd);								   /* 关闭套接字,结束通信 */
	return 0;
}

makefile

all:server client

server:server.c
        gcc server.c -o server 
client:client.c
        gcc client.c -o client

clean:
        rm *.o server client

.PHONY:clean

测试

 

关于程序中用到的函数可直接在终端中使用命令:man 函数名

比如查找socket函数用法信息:man socket

 

相关文章:

  • QtTCP通信示例
  • (5)STL算法之复制
  • (6)STL算法之转换
  • (7)STL算法之交换赋值
  • 菱形继承问题
  • 改善程序与设计的N个做法
  • C++数据结构之顺序表
  • C++数据结构之单链表
  • (8)STL算法之替换
  • (9)STL算法之逆转旋转
  • NFS安装使用
  • STL之map(关联式容器)
  • STL之unordered_map
  • 动态规划
  • 算法分析
  • 230. Kth Smallest Element in a BST
  • es6要点
  • github指令
  • JS数组方法汇总
  • Netty 4.1 源代码学习:线程模型
  • React系列之 Redux 架构模式
  • sessionStorage和localStorage
  • spring学习第二天
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vagrant 添加本地 box 安装 laravel homestead
  • vue2.0项目引入element-ui
  • 大型网站性能监测、分析与优化常见问题QA
  • 当SetTimeout遇到了字符串
  • 今年的LC3大会没了?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 思维导图—你不知道的JavaScript中卷
  • 一些css基础学习笔记
  • 优化 Vue 项目编译文件大小
  • 中文输入法与React文本输入框的问题与解决方案
  • 阿里云ACE认证学习知识点梳理
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (二)Linux——Linux常用指令
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (顺序)容器的好伴侣 --- 容器适配器
  • (正则)提取页面里的img标签
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***检测工具之RKHunter AIDE
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .md即markdown文件的基本常用编写语法
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net7 环境安装配置
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开发不可不知、不可不用的辅助类(一)