网络编程基础之TCP学习(二)编程案例
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学习(二)编程案例的更多相关文章
- 网络编程基础之TCP编程学习(一)
网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socke ...
- 网络编程模型及TCP、UDP编程设计
1.Linux网络模型 Linux网络编程--->>>socket套接字的编程 2.TCP网络模型 ...
- Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- 第1章 网络编程基础(4)——TCP/IP通信
TCP协议利用网络层IP协议提供不可靠的通信服务,解决分组的重传和排序问题,为应用程序提供可靠的.端到端的.面向连接的基于字节流的服务. 对等TCP传输实体间的通信具有如下特征: 全双工 只支持两个端 ...
- Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...
- Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- python编程基础知识—列表(二)
3操作列表 3.1 遍历整个列表 使用for循环 cars = ['bmw','audi','toyota','Jeep'] for i in cars: print(i) bmw audi toyo ...
- 【转/TCP协议编程】 基于TCP的Socket 编程
基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...
- 【shell编程基础0】bash shell编程的基本配置
前面一篇“shell编程之变量篇”主要讲述下shell编程的变量的基本知识:设置变量的方式,自定义变量和环境变量的差别,变量的替换.删除.测试等. 这一篇主要是讲述在bash shell下的一些基本配 ...
随机推荐
- 简单范例php调用C# WebService
准备工作:1. 安装IIS对于PHP的支持,看这里2. 要调用Web Service需要nusoap支持,只要弄个nusoap.php就可以了,把它放在要运行的php文件能够引用的地方,比如我放在同一 ...
- swift 第十二课 as 的使用方法
忽略的基础性的问题,应该早点写出这个问题的解释比较好,毕竟 swift 好多的地方都用到了 as as!as?,是非常容易搞晕大脑的 1,as使用场合 (1)从派生类转换为基类,向上 ...
- Leetcode之分治法专题-654. 最大二叉树(Maximum Binary Tree)
Leetcode之分治法专题-654. 最大二叉树(Maximum Binary Tree) 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左 ...
- pytest.mark.parametrize()参数化的应用一
from page.LoginPage import Loginpage import os, sys, pytest base_dir = os.path.dirname(os.path.dirna ...
- twig 模板控制器对应列表
{{ render(controller(metas.header,{request:app.request, course: course, member: member|default(null) ...
- Cron 表达式学习
1.7个子域的说明 cron 的表达式是字符串,实际上是由七子表达式(从左到右),描述个别细节的时间表.这些子表达式是分开的空白. 顺序(从左到右) 子串 有效数字 有效字符 1 Seconds(秒) ...
- linux中sleep详解实例
在linux编程中,有时候会用到定时功能,常见的是用sleep(time)函数来睡眠time秒:但是这个函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时 ...
- win10配置Keras及GPU环境
今天搭建了Keras深度学习的环境 详细记录一下 安装Anaconda3 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. Anac ...
- oracle共享数据库操作
Hello,大家好,这个功能相信新手小白很需要,今天小编因为刚好遇到,所以写出来分享给大家,首先你电脑得有数据库,以及PLSQL工具包,这个相信大家都有了 1.打开NET Manger应用,win10 ...
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...