网络编程基础之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(1);
}
}

/*输出连接上来的客户端相关信息*/
void out_addr(struct sockaddr_in *clientaddr)
{
//将端口从网络字节序转换成主机字节序
int port = ntohs(clientaddr->sin_port);
char ip[16];
memset(ip, 0, 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[20] = "get!";
char *s = t;
size_t size = (strlen(s)+1)*sizeof(char);
t[size-1] = ‘\n‘;
//将服务器获得的系统时间写回到客户端
if(write(fd, s, size) != size)
{
perror("write error");
}

}

int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("usage: %s #port\n",argv[0]);
exit(1);
}
if(signal(SIGINT, sig_handler) == SIG_ERR)
{
perror("signal sigint error");
exit(1);
}

/* 步骤1: 创建socket(套接字)
* AF_INET:IPV4
* SOCK_STREAM:TCP协议
**/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket error");
exit(1);
}
/* 步骤2:调用bind函数将socket和地址
* (包括ip、port)进行绑定
*/
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
//往地址中填入ip、port、internet地址族类型
serveraddr.sin_family = AF_INET;//IPV4
serveraddr.sin_port = htons(atoi(argv[1]));
serveraddr.sin_addr.s_addr = INADDR_ANY;
//监听所有服务器上ip得到的连接请求
// #define INADDR_ANY (uint32_t)0x00000000
if(bind(sockfd,(struct sockaddr*)&serveraddr,
sizeof(serveraddr)) < 0)
{
perror("bind error");
exit(1);
}

/*
* 步骤3:调用listen函数启动监听(指定port监听)
* 通知系统去接受来自客户端的连接请求
* (将接受到的客户端的连接请求放置到对应的队列中)
× 第二个参数:指定队列的长度
*/
if(listen(sockfd, 10) < 0)
{
perror("listen error");
exit(1);
}

/*
* 步骤4:调用accept函数从队列中获得
* 一个客户端的请求连接,并返回新的
* 注意:若没有客户端连接,调用此函数后会阻塞,
* 直到获得一改客户端的链接。
*/
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(clientaddr);
while(1)
{
int fd = accept(sockfd,
(struct sockaddr*)&clientaddr,
&clientaddr_len);
if(fd < 0)
{
perror("accept error");
continue;
}
/*
* 步骤5:调用I/O函数(read/write)和
* 连接的刻苦端进行双向的通信
*/
out_addr(&clientaddr);
do_server(fd);

/* 步骤6:关闭socket*/
close(fd);
}
return 0;
}

客户端程序

#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 < 3)
{
printf("usage: %s ip port",argv[0]);
exit(1);
}

/*步骤1:创建socket*/
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket error");
exit(1);
}

struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(atoi(argv[2]));
//将ipo地址转换成网络字节序后填入serveraddr中
inet_pton(AF_INET,argv[1],
&serveraddr.sin_addr.s_addr);

/*
* 步骤2:客户端调用connect函数连接到服务器端
*/
if(connect(sockfd,
(struct sockaddr*)&serveraddr,
sizeof(serveraddr)) < 0)
{
perror("connect error");
exit(1);
}

/*步骤3:调用IO函数和服务器端进行双向通信*/
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
size_t size;
if((size = read(sockfd,
buffer,sizeof(buffer))) < 0)
{
perror("read error");
}
if(write(STDOUT_FILENO, buffer, size) != size)
{
perror("write error");
}

return 0;
}

原文地址:https://www.cnblogs.com/lttdxuexizhilu/p/11604358.html

时间: 2024-11-07 13:51:32

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

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

没有任何编程基础可以直接学习python语言吗?学会后能够做什么?

很明确的说 python非常适合没有任何编程基础的人入门.. 目前应用最多的:全栈开发.数据分析.运维开发,今天我们就以这三个重点的岗位来做一下自学Python的规划,希望你在学之前就能有结果的来走得更远. 很多人在问,python学了之后能做些什么? 既然你没有碰过 Python ,不知编程为何物的人,我就不提编程里面的项目名了--创一个小群,供大家学习交流聊天如果有对学python方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学python能够持之以

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

网络编程基础了解 socket套接字 socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段. linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符.一个完整的socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每个socket有一个本地唯一Socket,由操作系统分配. 定位某个计算机用IP,定位某个服务用端口. 创建Socket #include <s

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

WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock2,在vs2010环境下,通常使用WinSock 2.2实现网络通信的功能. 1.Socket接口启动需要引入头文件winsock2.h及库文件ws2_32.lib #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")

【编程基础】TCP协议中的三次握手和四次挥手(图解)

建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了. 那如何断开连接呢?简单的过程如下: [注意]中断连接端可以是Client端,也可以是Server端. 假设Client端发起中断连接请求,也就是发送FIN报文.Server端接到FIN报文后,

第二周:神经网络的编程基础----------0、学习目标

1. Build a logistic regression model, structured as a shallow neural network2. Implement the main steps of an ML algorithm, including making predictions, derivative computation, and gradient descent.3. Implement computationally efficient, highly vect

【python之路】【2、编程基础】Python学习中的问题1

[列表中的重复数据,使用for循环遍历列表时,最后只取一次.] 1 #商店里的商品列表 2 com = [ 3 ("iphone",5800), 4 ("macbook",9000), 5 ("coffee",320), 6 ("pythonbook",80), 7 ("bicyle",1500) 8 ] 9 shoplist = []#购物车变量 10 11 salary = input("请输

socket编程:简单TCP服务器/客户端编程

其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了. 一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个&

TCP学习二

1 /* 2 客户端流程: 3 1.创建客户端socket服务对象,明确连接到哪个主机; 4 2.将数据写到socket对象的输出流中; 5 3.获取服务端发送回来的socket对象输入流; 6 4.关闭服务 7 */ 8 import java.net.*; 9 import java.io.*; 10 class TCPSend2 11 { 12 public static void main(String[]args) throws Exception 13 { 14 //创建客户端soc