linux下网络编程学习——入门实例ZZ
http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html
一起来:
诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 :
1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求。
2)在网络的某台机器上,用户执行客户机程序
3)客户机进行与服务器进程建立一条连接
4)连接建立后,客户机通过网路向服务器发出请求,请求某种服务。
5)服务器接收到客户机的请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回。
6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求。
现在介绍一个实例
功能:实现简单的服务器-客户机编程,客户机发送连接请求后接受到连接成功信息。
代码包括两部分,服务器部分(service.c)和客户机部分(client.c)
/*service.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 3490 /*开放的端口号*/
#define BACKLOG 5 /*指定套接字可以接受的最大未接受客户机请求的数目*/
main()
{
int sockfd,new_fd;
struct sockaddr_in srvaddr;
struct sockaddr_in cliaddr;
int sin_size;
/*创建套接字描述符*/
if((sockfd=socket(AF_INET,SOCK_STREAM,))==-)
{
perror("socket error");
exit();
}
bzero(&srvaddr,sizeof(srvaddr));
/*用自己的ip地址和端口信息填充一个internet套接字地址结构*/
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(MYPORT);
/*函数bind将服务器的地址和套接字帮定在一起*/
if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-)
{
perror("bind error");
exit();
}
/*listen函数告诉内核,这个套接字可以接受来自客户机的请求*/
if(listen(sockfd,BACKLOG)==-)
{
perror("listen error");
exit();
}
/*处理客户机的请求,调用函数accept来获得一个客户机的连接*/
for(;;)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)&cliaddr,&sin_size))==-)
{
perror("accept error");
continue;
}
printf("server: got connection from %s \n",inet_ntoa(cliaddr.sin_addr));
/*向客户起写数据*/
if(write(new_fd,"Hello,Network!\n",)==-)
perror("write error!");
close(new_fd);
}
close(sockfd);
}
下面为client:
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 3490
#define MAXDATASIZE 5000
int main(int argc,char **argv)
{
int sockfd,nbytes;
char buf[];
struct hostent *he;
struct sockaddr_in srvaddr;
if(argc!=)
{
perror("Usage:client hostname\n");
exit();
}
/*函数gethostbyname获得指定域名地址所对应的ip地址*/
if((he=gethostbyname(argv[]))==NULL)
{
perror("gethostbyname");
exit();
}
/*创建套接字,返回套接字描述符*/
if((sockfd=socket(AF_INET,SOCK_STREAM,))==-)
{
perror("create socket error");
exit();
}
bzero(&srvaddr,sizeof(srvaddr));
/*用获得的远程服务器进程的ip地址和端口号来填充一个internet套接字地址结构*/
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(PORT);
srvaddr.sin_addr=*((struct in_addr *)he->h_addr);
/*用connect于这个远程服务器建立一个internet连接*/
if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-)
{
perror("connect error");
exit();
}
/*调用read函数读取服务器write过来的信息*/
if((nbytes=read(sockfd,buf,MAXDATASIZE))==-)
{
perror("read error");
exit();
}
buf[nbytes]='\0';
printf("read: %s",buf);
close(sockfd);
}
下面我们来编译执行看看效果哦
编译:
#gcc -o service service.c
#gcc -o client client.c
修改执行权限
#chmod 770 service
#chmod 770 client
执行
现执行服务器端哦
#./service
另开一个命令行窗口,连接服务器的3490端口
#./client localhost
呵呵,看到效果了吧
服务器端:
|
客户端
|
linux下网络编程学习——入门实例ZZ的更多相关文章
- Linux下网络编程学习杂记
1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)-> ...
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- Linux C++ 网络编程学习系列(1)——端口复用实现
Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...
- Linux C网络编程学习笔记
Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- Linux C++ 网络编程学习系列(7)——mbedtls编译使用
mbedtls编译使用 环境: Ubuntu18.04 编译器:gcc或clang 编译选项: 静态编译使用 1. mbedtls源码 下载地址: https://github.com/ARMmbed ...
- linux下网络编程常见问题
网络程序异常退出无core文件产生 这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core. ...
- Linux C++ 网络编程学习系列(5)——多路IO之epoll边沿触发
多路IO之epoll边沿触发+非阻塞 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_ET_LT_NOBLOCK_example 源码说 ...
- Linux C++ 网络编程学习系列(6)——多路IO之epoll高级用法
poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_libevent 源码说明: server.cpp: 监听127. ...
随机推荐
- 在ionic3自定义组件中使用官方组件
先创建组件: ionic g component xxx 在components里面如下图引入
- Fiddler模拟发送post请求
fiddler在进行接口测试时,会模拟post请求,发送不同的请求参数,返回不同的结果,今天我们就来分享一下,怎么用Fiddler工具模拟post请求: 打开Fiddler工具,在右侧点击“compo ...
- ngx.location.capture 只支持相对路径,不能用绝对路径
ngx.location.capture 是非阻塞的,ngx.location.capture也可以用来完成http请求,但是它只能请求到相对于当前nginx服务器的路径,不能使用之前的绝对路径进行访 ...
- JSP页面GET传值乱码问题
两个JSP页面进行GET传值的时候.两个页面的编码都是UTF-8,且传值之前设置response的content为UTF-8也解决不了问题. 设置tomcat的配置文件server.xml:在Conn ...
- 项链(burnside)
Description 有一个长度为 \(n\) 的项链,首尾相接形成环,现在你要给每一个位置一个颜色 \([1,m]\), 求所有不同的项链个数(可以通过旋转变成一样的称为相同) Solution ...
- web渗透笔记
1.安装nmap记录:(1)下载:wget http://nmap.org/dist/nmap-6.46.tar.bz2(最新版)wget http://nmap.org/dist/nmap-6.00 ...
- group by 语句
user E_book go 这样的程序会出错,因为play没有使用sum,所以要分组. group by play 有函数的和没有函数的表一起使用要用 GROUP BY .AVG 求平均值,只能与数 ...
- 关于windowsServer编程
1.关于windowsServer编程
- Java中的断言 Assert
今天正好遇到了,就记一下 一.作用: 用与编写单元测试 二.assert 关键字 assert 理论上和 if类似, 但是assert 仅仅用于测试, 不能用于业务 如果发现断言无效, 则可能时ide ...
- vim的多标签
vim支持多标签页,可以在同一窗口同时打开多个文档, 两种方法: vim -d 通过vim --help后发现vim -d相当与vimdiff模式 例子: $ vim -d a.txt b.txt c ...