http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html
是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵。

一起来:

诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 :

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
呵呵,看到效果了吧
服务器端:

server: got connection from 127.0.0.1

客户端

read: Hello,Network!

linux下网络编程学习——入门实例ZZ的更多相关文章

  1. Linux下网络编程学习杂记

    1.TCP/IP协议的体系结构包含四层:应用层(负责应用程序的网络服务,通过端口号识别各个不同的进程)->传输层(传输控制层协议TCP.用户数据报协议UDP.互联网控制消息协议ICMP)-> ...

  2. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  3. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

  4. Linux C网络编程学习笔记

    Linux C网络编程总结报告 一.Linux C 网络编程知识介绍: 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端:(client) 在网络程序中, ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. Linux C++ 网络编程学习系列(7)——mbedtls编译使用

    mbedtls编译使用 环境: Ubuntu18.04 编译器:gcc或clang 编译选项: 静态编译使用 1. mbedtls源码 下载地址: https://github.com/ARMmbed ...

  7. linux下网络编程常见问题

    网络程序异常退出无core文件产生 这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core. ...

  8. Linux C++ 网络编程学习系列(5)——多路IO之epoll边沿触发

    多路IO之epoll边沿触发+非阻塞 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_ET_LT_NOBLOCK_example 源码说 ...

  9. Linux C++ 网络编程学习系列(6)——多路IO之epoll高级用法

    poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_libevent 源码说明: server.cpp: 监听127. ...

随机推荐

  1. LINUX安装UNZIP

    安装完linux ,发现没有UNZIP,没办法,重新安装. 1.获取unzip源码 sudo wget http://downloads.sourceforge.net/infozip/unzip55 ...

  2. poj 3748 位操作

    位操作 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8856   Accepted: 3535 Description 假 ...

  3. 记一次bug修复过程

    我的建议,究竟有谁会看,以我的位置,到底能推动到哪一层可行性,可能性 问题:用户的数据丢失了.以为是修改操作 有bug,但查看了后端接口和前端校验,都没有发现问题.但是input数据没有日志[日志级别 ...

  4. SSIS教程:创建简单的ETL包

    SSIS: Microsoft SQL Server Integration Services.是一个可用于生成高性能数据集成解决方案的平台,其中包括数据仓库的提取(Extract).转换(Trans ...

  5. 2017年12月13日 LinQ用法基本的增删改查

    LinQ是什么? LinQ是语言集成的查询,是用于C#跟Vb的扩展语言 LinQ的用法 新建一个App_Code文件夹,在文件夹下添加一个数据LinQ to SQL类,可以直接直接点击服务器管理器然后 ...

  6. 【转】百亿级实时大数据分析项目,为什么不用Hadoop?

    百亿数量级的大数据项目,软硬件总体预算只有30万左右,需求是进行复杂分析查询,性能要求多数分析请求达到秒级响应.        遇到这样的项目需求,预算不多的情况,似乎只能考虑基于Hadoop来实施. ...

  7. Spring课程 Spring入门篇 7-1 Aspect介绍及PointCut注解应用

    本节主要是理论型: 关键看下节实操. 这个其实只要理解一点:使用AspectJ进行Spring AOP 编程,其实就是使用了JAVA注解的风格进行配置和使用. 不像之前讲的那样在配置文件中配置使用.

  8. Chrome 声音自动播放抱错问题【play() failed】

    Chrome下调用play后抱错:DOMException: play() failed because the user didn't interact with the document firs ...

  9. 读ios开发有感——建立APP开发体系

    前言:ios开发和现在的大前端.跨端开发在底层上的道理是相通的,因此通过学习ios开发,可以形成对APP开发体系的理解. 一.app开发的知识体系 基础 应用开发 原理 原生与前端 二.基础模块 按照 ...

  10. java.util.concurrent.Semaphore 使用

    1. 概述 Semaphore(信号)  并不存在真正的许可 只是维护一个计数器, 通常用来限定进入一些资源的线程数 accquire()  方法获取许可 成功则计数器值-1 没有则阻塞直到一个可用的 ...