TCP网络编程流程如下:

实现功能:服务器端与客户端成功通讯后返回get!

服务器端程序

 #include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <signal.h>
#include <arpa/inet.h> int sockfd; void sig_handler(int signo)
{
if(signo == SIGINT)
{
printf("server close\n");
/*步骤6:关闭socket*/
close(sockfd);
exit();
}
} /*输出连接上来的客户端相关信息*/
void out_addr(struct sockaddr_in *clientaddr)
{
//将端口从网络字节序转换成主机字节序
int port = ntohs(clientaddr->sin_port);
char ip[];
memset(ip, , sizeof(ip));
//将ip地址从网络字节序转换成点分十进制
inet_ntop(AF_INET,
&clientaddr->sin_addr.s_addr, ip, sizeof(ip));
printf("client:%s(%d) connected\n", ip, port);
} void do_server(int fd)
{ //返回get!
char t[] = "get!";
char *s = t;
size_t size = (strlen(s)+)*sizeof(char);
t[size-] = '\n';
//将服务器获得的系统时间写回到客户端
if(write(fd, s, size) != size)
{
perror("write error");
} } int main(int argc, char *argv[])
{
if(argc < )
{
printf("usage: %s #port\n",argv[]);
exit();
}
if(signal(SIGINT, sig_handler) == SIG_ERR)
{
perror("signal sigint error");
exit();
} /* 步骤1: 创建socket(套接字)
* AF_INET:IPV4
* SOCK_STREAM:TCP协议
**/
sockfd = socket(AF_INET, SOCK_STREAM, );
if(sockfd < )
{
perror("socket error");
exit();
}
/* 步骤2:调用bind函数将socket和地址
* (包括ip、port)进行绑定
*/
struct sockaddr_in serveraddr;
memset(&serveraddr, , sizeof(serveraddr));
//往地址中填入ip、port、internet地址族类型
serveraddr.sin_family = AF_INET;//IPV4
serveraddr.sin_port = htons(atoi(argv[]));
serveraddr.sin_addr.s_addr = INADDR_ANY;
//监听所有服务器上ip得到的连接请求
// #define INADDR_ANY (uint32_t)0x00000000
if(bind(sockfd,(struct sockaddr*)&serveraddr,
sizeof(serveraddr)) < )
{
perror("bind error");
exit();
} /*
* 步骤3:调用listen函数启动监听(指定port监听)
* 通知系统去接受来自客户端的连接请求
* (将接受到的客户端的连接请求放置到对应的队列中)
× 第二个参数:指定队列的长度
*/
if(listen(sockfd, ) < )
{
perror("listen error");
exit();
} /*
* 步骤4:调用accept函数从队列中获得
* 一个客户端的请求连接,并返回新的
* 注意:若没有客户端连接,调用此函数后会阻塞,
* 直到获得一改客户端的链接。
*/
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
while()
{
int fd = accept(sockfd,
(struct sockaddr*)&clientaddr,
&clientaddr_len);
if(fd < )
{
perror("accept error");
continue;
}
/*
* 步骤5:调用I/O函数(read/write)和
* 连接的刻苦端进行双向的通信
*/
out_addr(&clientaddr);
do_server(fd); /* 步骤6:关闭socket*/
close(fd);
}
return ;
}

客户端程序

#include <netdb.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <unistd.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{ if(argc < )
{
printf("usage: %s ip port",argv[]);
exit();
} /*步骤1:创建socket*/
int sockfd = socket(AF_INET, SOCK_STREAM, );
if(sockfd < )
{
perror("socket error");
exit();
} struct sockaddr_in serveraddr;
memset(&serveraddr, , sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[]));
//将ipo地址转换成网络字节序后填入serveraddr中
inet_pton(AF_INET,argv[],
&serveraddr.sin_addr.s_addr); /*
* 步骤2:客户端调用connect函数连接到服务器端
*/
if(connect(sockfd,
(struct sockaddr*)&serveraddr,
sizeof(serveraddr)) < )
{
perror("connect error");
exit();
} /*步骤3:调用IO函数和服务器端进行双向通信*/
char buffer[];
memset(buffer, , sizeof(buffer));
size_t size;
if((size = read(sockfd,
buffer,sizeof(buffer))) < )
{
perror("read error");
}
if(write(STDOUT_FILENO, buffer, size) != size)
{
perror("write error");
} return ;
}

网络编程基础之TCP学习(二)编程案例的更多相关文章

  1. 网络编程基础之TCP编程学习(一)

    网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...

  2. 网络编程模型及TCP、UDP编程设计

    1.Linux网络模型 Linux网络编程--->>>socket套接字的编程 2.TCP网络模型                                          ...

  3. Java网络编程基础之TCP粘包拆包

    TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...

  4. 第1章 网络编程基础(4)——TCP/IP通信

    TCP协议利用网络层IP协议提供不可靠的通信服务,解决分组的重传和排序问题,为应用程序提供可靠的.端到端的.面向连接的基于字节流的服务. 对等TCP传输实体间的通信具有如下特征: 全双工 只支持两个端 ...

  5. Socket编程基础——面向连接TCP

    WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...

  6. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  7. python编程基础知识—列表(二)

    3操作列表 3.1 遍历整个列表 使用for循环 cars = ['bmw','audi','toyota','Jeep'] for i in cars: print(i) bmw audi toyo ...

  8. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  9. 【shell编程基础0】bash shell编程的基本配置

    前面一篇“shell编程之变量篇”主要讲述下shell编程的变量的基本知识:设置变量的方式,自定义变量和环境变量的差别,变量的替换.删除.测试等. 这一篇主要是讲述在bash shell下的一些基本配 ...

随机推荐

  1. laravel中的管道设计模式

    转自 http://laravelacademy.org/post/3088.html

  2. QFramework 使用指南 2020(八):Res Kit(2)模拟模式与非模拟模式

    在上一篇,介绍了 Res Kit 的基本使用,相信大家已经体会到了 Res Kit 的简便之处了. 在这一篇,我们试着探讨一下 Res Kit 的设计背后原理. AssetBundle 的不便之处 在 ...

  3. 10.Windows远程管理工具RAT----Metasploit基础----Metasploit模块----fsociety工具包

    Windows远程管理工具RAT QuasarRAT github.com/quasar/QuasarRAT 命令环境 MINGW64 (GCC编译器) mkdir RAT cd RAT git cl ...

  4. 义隆单片机学习笔记之(一) 硬件框架&资源下载

    参考网址: 点击链接或右键链接地址 (台湾义隆官网)http://www.emc.com.tw/chs/tech_8bit.asp (EM78P153K官方资料)http://www.emc.com. ...

  5. python 3 获取本机公网ip的几种方法

    参考博客:https://blog.csdn.net/conquerwave/article/details/77666226 from urllib.request import urlopen f ...

  6. Mysql性能优化之---(二)

    建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没 ...

  7. 初识gRPC

    一.gRPC的概念 gRPC是Google推出的一个开源高性能的轻量级RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...

  8. poj3977(折半枚举+二分查找)

    题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...

  9. 【AI】【人工智能】【计算机】人工智能工程技术人员等职业信息公示

    人社厅发[2019]48号 各省.自治区.直辖市及新疆生产建设兵团人力资源社会保障厅(局).市场监管局.统计局,国务院各部门.各直属机构.各中央企业.有关社会组织人事劳动保障工作机构,中央军委政治工作 ...

  10. log4j一些配置用法

    Log4j基本用法----日志级别 基本使用方法: Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO ...