TCP编程的一个小例子
TCP程序的服务器端与客户端的流程图
例子:服务器端等待客户端连接,若连接成功,则用户可以通过客户端向服务器端发送任意字符串,服务器端在收到字符串后,输出相关信息,在把接受到的字符串重新发生给客户端。客户端收到后显示在屏幕上
服务器端:
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> #define SERVER_PORT 5555 int main()
{
int serverSocket;
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
int client;
char buffer[1024];
int iDataNum; //创建服务器端套接字,SOCK_STREAM指的是TCP通信,面向连接的字节流;SOCK_DGRAM是指UDP通信
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) //创建服务器端套接字,返回值为套接字号
{
perror("socket");
exit(1);
} bzero(&server_addr, sizeof(server_addr));
// memset(server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; //AF_INET用来指定当前采用的协议是TCP/IP
server_addr.sin_port = htons(SERVER_PORT); //htons()用于字节序的转换,表示将一个数值从主机字节序转换成网络字节序,保证数据的一致性
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//htons()函数是指16字节的转换,htonl()是32字节序转换
if (bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) //将地址信息与此前创建成功的套接字关联在一起
{
perror("connect");
exit(1);
} if (listen(serverSocket, 5) < 0) //服务套接字在指定端口监听,以被动的方式等待客户端连接,其中5为请求连接队列的最大长度
{
perror("listen");
exit(1);
} while (1)
{
//accept()函数主要是在指定的端口侦听,当客户端的连接请求到来时,维护并完成通信连接的建立,然后在这条链路上进行数据的收发
//第一个参数为当前服务套接字,第二个参数用于保存当前客户端的地址信息,第三个参数为客户端地址的长度
client = accept(serverSocket, (struct sockaddr *)&clientAddr, (socklen_t *)&addr_len);
if (client < 0)
{
perror("accept");
continue;
}
iDataNum = read(client, buffer, 1024);
buffer[iDataNum] = '\0';
if (iDataNum < 0)
{
perror("recv");
continue;
}
printf("\nRecv client data...\n");
printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));
printf("Port is %d\n", htons(clientAddr.sin_port));
printf("Recv Data is %s, the data length is %d\n", buffer, iDataNum);
write(client, buffer, iDataNum);
}
return 0;
}
客户端:
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> int main()
{
int len;
struct sockaddr_in serverAddr;
int clientSocket;
char sendbuf[200];
char recvbuf[200];
if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket error");
return -1;
} serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5555);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//connect()函数帮助客户端向指定地址的服务器发起一条TCP连接,成功返回0;第一个参数为连接套接字,第二个为服务器端的地址信息和协议信息
if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)
{
perror("connect");
exit(1);
}
printf("connect with destination host...\n");
while (1)
{
printf("Input your Word:>");
scanf("%s", sendbuf); //缺陷:不能传输带空格的句子
printf("\n"); if (strcmp(sendbuf, "quit") == 0)
break; write(clientSocket, sendbuf, strlen(sendbuf));
len = read(clientSocket, recvbuf, 200);
recvbuf[len] = '\0';
printf("recv data of my word is : %s\n", recvbuf);
}
close(clientSocket); return 0;
}
注:有个小问题是为什么客户端不能循环输入?
UDP即无链接编程,和这个类似,一般用在P2P中,主要是创建socket的时候,要指定SOCK——DGRAM.
数据的收发调用sendto()和recvfrom().
TCP编程的一个小例子的更多相关文章
- 基于委托的C#异步编程的一个小例子 带有回调函数的例子
我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- 使用Trinity拼接以及分析差异表达一个小例子
使用Trinity拼接以及分析差异表达一个小例子 2017-06-12 09:42:47 293 0 0 Trinity 将测序数据分为许多独立的de Brujin grap ...
- 从一个小例子认识SQL游标
1 什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...
- 关于SVN配置文件的一个小例子
1 背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...
- Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期
学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...
- Spring和Hibernate结合的一个小例子
1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...
随机推荐
- LitJson解析遇到的坑
今天在些项目的时候,遇到一个坑,现在跟大家分享一下 我遇到的错误是MissingMethodException: Method not found: 'Default constructor not ...
- 搭建Hadoop集群 (二)
前面的步骤请看 搭建Hadoop集群 (一) 安装Hadoop 解压安装 登录master, 下载解压hadoop 2.6.2压缩包到/home/hm/文件夹. (也可以从主机拖拽或者psftp压缩 ...
- C++から広がり
泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库.所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能 ...
- BUAA 更大公约数
题目链接 给一个n*m的矩阵, 删除里面的一行一列, 使得剩下的数的最大公约数最大. 一个格子(x,y), 先预处理出(1,1)到这个格子的内所有数的最大公约数, 同理处理出(1, m), (n, m ...
- Android中计算时间差的实现方法
今天为“至简天气”增加了一项功能:在启动时根据上次更新数据的时间判断是否有必要更新数据,因为 weather.com.cn 的实况数据貌似是25分钟才会刷新一次,只有在据上次更新的时间达25分钟以上才 ...
- XSS CSRF
XSS CSRF XSS 参考 https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC ...
- .NET 条件查询实现--类似网上商城宝贝搜索
需要实现的效果:点击表格列头:弹出一个层,用户可以输入当前列头的查询条件,点击确定之后,把该列头的查询信息显示在页面顶部,用户可以叉掉这个查询条件,恢复到查询之前的数据. 大致实现的效果图: 项目背景 ...
- Android 三大图片缓存原理、特性对比
这是我在 MDCC 上分享的内容(略微改动),也是源码解析第一期发布时介绍的源码解析后续会慢慢做的事. 从总体设计和原理上对几个图片缓存进行对比,没用到他们的朋友也可以了解他们在某些特性上的实现. 上 ...
- 我的MYSQL学习心得 mysql日志
这一篇<我的MYSQL学习心得(十五)>将会讲解MYSQL的日志 MYSQL里的日志主要分为4类,使用这些日志文件,可以查看MYSQL内部发生的事情. 分别是 1.错误日志:记录mysql ...
- java设计模式(二)单例模式 建造者模式
(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...