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编程的一个小例子的更多相关文章

  1. 基于委托的C#异步编程的一个小例子 带有回调函数的例子

    我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...

  2. java连接mysql的一个小例子

    想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...

  3. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  4. MVVM模式的一个小例子

    使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...

  5. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  6. 从一个小例子认识SQL游标

    1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...

  7. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  8. Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

    学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...

  9. Spring和Hibernate结合的一个小例子

    1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...

随机推荐

  1. Object-c的一些基本概念

    自学了一个多月的IOS,对Object-C也有了初步的认识,也有很多观点不知道是否正确,所以整理了一下,和小伙伴们分享分享 1.OC中使用的消息机制代替调用方法 区别:使用消息结构的语言,其运行时缩引 ...

  2. 对常量的引用(reference to const)的一般用途(转载)

    如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对C++常量引用可以用其它任何引用来初始化:但不能改变. 关于引用的初始化 ...

  3. 关于win7系统的Oracle安装时的[INS-30131]问题的解决方案

    我是今天晚上安装的Oracle,结果在第二步遇到了这个问题,前后折腾了两个小时,百度了很多解决方案,终于解决了这个问题; 由于我的电脑系统还是win7的系统,其他的我没试过,不过也差不多都这么解决; ...

  4. ORA-01045: user XXZY lacks CREATE SESSION privilege; logon denied

    在创建用户时,一般我们都分配connect.dba.resource 角色,但是,为什么登陆时还报错呢 原因:用户角色没有激动 解决:ALTER USER XXXX DEFAULT ROLE &quo ...

  5. BOM 浏览器对象模型学习

    window对象属性 innerWidth/innerHeight 浏览器窗口的内部宽度与高度 outerWidth/outerHeight 浏览器的外部宽度与高度 length window.fra ...

  6. iOS 开源库

    youtube下载神器:https://github.com/rg3/youtube-dl我擦咧 vim插件:https://github.com/Valloric/YouCompleteMevim插 ...

  7. Delphi中Android运行和JNI交互分析

    Androidapi.JNIBridge负责和JNI交互.,既然要交互,那么首先就是需要获得JNI的运行环境,Android本身内置的就有一个Java(Dalvik)虚拟机.所以这个第一步就肯定是要这 ...

  8. adb server is out of date. killing... ADB server didn't ACK * failed to star

    The connection to adb is down, and a severe error has occured. [-- :: - HelloOPone] You must restart ...

  9. 浅谈 android-query

    介绍:android-query他是在GitHub上的一个开源轻量级的封装库,它集成了网络 .图片加载等模块,可以应用在android中的一些异步应用以及UI的操纵上,通过使用这个框架,使androi ...

  10. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...