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. Jenkins之自动发送git变更到微信

    当我们通过Jenkins构建job的时候,是可以获取到git Change Log 的信息, 即本次上线修改了什么功能,我们将这个信息发送到微信群相关人员可直接获取到上线变更信息, 这样就不需要人为的 ...

  2. 陷门函数Trapdoor Function

    陷门函数:正向计算是很容易的,但若要有效的执行反向计算则必须要知道一些secret/knowledge/trapdoor(知识?),也称为伪随机置换,可用于构造公钥密码系统. 若 f 为陷门函数,则 ...

  3. iOS自定义下拉列表

    实现效果如下: 点击导航栏的“点击”,弹出下拉列表. 注意:绿色的是控制器的view背景,又一个遮罩层,点击可以隐藏列表. Github地址: https://github.com/PengSiSi/ ...

  4. laravel中的管道设计模式

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

  5. Spring Aop(十二)——编程式的创建Aop代理之AspectjProxyFactory

    转发地址:https://www.iteye.com/blog/elim-2397922 编程式的创建Aop代理之AspectjProxyFactory 之前已经介绍了一款编程式的创建Aop代理的工厂 ...

  6. 【Fiori系列】为什么SAP Fiori活的如此精致

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]为什么SAP Fiori活的如 ...

  7. Windows核心编程随笔

    最近在学习Windows底层原理,准备写个系列文章分享给大家,Michael Li(微软实习期间的Mentor,为人超好)在知乎回答过一些关于学习Windows原理的书籍推荐,大家可以拜读其中一本来入 ...

  8. 【AMAD】django-compressor -- 将JS和CSS文件压缩为一个缓存文件

    简介 个人评分 简介 django-compressor1的example: {% load compress %} {% compress css %} <link rel="sty ...

  9. WCF服务的Web HTTP方式

    NET 3.5以后,WCF中提供了WebGet的方式,允许通过url的形式进行Web 服务的访问.现将WCF服务设置步骤记录如下: endpoint通讯协议设置成  webHttpBinding en ...

  10. HDU4513 【mannacher算法】

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4513 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在 ...