千家信息网

如何使用linux网络编程用到的网络函数

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,本篇内容主要讲解"如何使用linux网络编程用到的网络函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用linux网络编程用到的网络函数"吧!一.
千家信息网最后更新 2025年11月12日如何使用linux网络编程用到的网络函数

本篇内容主要讲解"如何使用linux网络编程用到的网络函数",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何使用linux网络编程用到的网络函数"吧!

一.概念介绍
网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。
我们编写网络程序时,一般是基于TCP协议或者UDP协议进行网络通信的。
TCP:(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端之间的传输是可靠的。
UDP:(User Datagram Protocol)用户数据报协议是一种非面向连接的协议, 这种协议并不能保证我们的网络程序的连接是可靠的。
我们编写的网络程序具体采用哪一类协议,要视具体情况而定。比如,如果是大数据量的通信,而且对数据的完整性要求不是特别高,则可以采用UDP协议,以得到更快的传输速率。如果我们是要实现一些诸如文件传输、社交通讯之类的功能,就需要采用TCP协议通信,以保证传输的可靠性。

二.初等网络函数介绍
int socket(int domain, int type,int protocol)
domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).
AF_UNIX只能够用于单一的Unix 系统进程间通信,
而AF_INET是针对Internet的,因而可以允许在远程
主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现所以用PF代替了AF,
不过我们都可以使用的).
type:我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)
SOCK_STREAM表明我们用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流.
SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信.
protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了 socket为网络通讯做基本的准备.
成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况.

int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket调用返回的文件描述符.
addrlen:是sockaddr结构的长度.
my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义
struct sockaddr{
unisgned short as_family;
char sa_data[14];
};
不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义
struct sockaddr_in{
unsigned short sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}
我们主要使用Internet所以
sin_family一般为AF_INET,
sin_addr设置为INADDR_ANY表示可以和任何的主机通信,
sin_port是我们要监听的端口号.sin_zero[8]是用来填充的.
bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样

int listen(int sockfd,int backlog)
sockfd:是bind后的文件描述符.
backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度.
listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.

int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen后的文件描述符.
addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. bind,listen和accept是服务器端用的函数,
accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,
这个时候服务器端可以向该描述符写信息了. 失败时返回-1

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
sockfd:socket返回的文件描述符.
serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址
addrlen:serv_addr的长度
connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.

更多函数请查看man …….

代码如下:


int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);


三.初等网络函数使用实例
一个教科书式的服务器端程序流程为:
建立套接字socket()--->将套接字绑定到ip地址bind()----->建立监听套接字listen()------>开始等待客户端请求accpet()
详细代码如下:

代码如下:


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
   int sockfd,connfd;
  struct sockaddr_in srvaddr;
  struct sockaddr_in cliaddr;
  int len,port;
  char hello[]="Hi,welcome to linux-code!\n";
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
    exit(1);
   }
  /* 服务器端填充 sockaddr结构 */
   bzero(&srvaddr,sizeof(struct sockaddr_in));
  srvaddr.sin_family=AF_INET;
  srvaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   srvaddr.sin_port=htons(1113);
  /* 捆绑sockfd描述符 */
   if(bind(sockfd,(struct sockaddr *)(&srvaddr),sizeof(struct sockaddr))==-1){
     fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
     exit(1);
  }
  /* 监听sockfd描述符 */
   if(listen(sockfd,5)==-1){
    fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
    exit(1);
  }
  len=sizeof(struct sockaddr_in);
  while(1){ /* 服务器阻塞,直到客户程序建立连接 */
    if((connfd=accept(sockfd,(struct sockaddr *)(&cliaddr),&len))==-1){
      fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
      exit(1);
     }
    fprintf(stderr,"Server get connection from %s\n",inet_ntoa(cliaddr.sin_addr));
     if(write(connfd,hello,strlen(hello))==-1){
      fprintf(stderr,"Write Error:%s\n",strerror(errno));
      exit(1);
     }
     /* 这个通讯已经结束 */
     close(connfd);
    /* 循环下一个 */
   }
  close(sockfd);
  exit(0);
}


一个教科书式的客户端程序流程为:
建立套接字socket()--->与服务器建立连接connect()
详细代码如下:

代码如下:


#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
  int sockfd; char buf[1024];
  struct sockaddr_in srvaddr;
   struct hostent *phost; int nbytes;
   if(argc!=3){
    fprintf(stderr,"Usage:%s \a\n",argv[0]);
    exit(1);
   }
   /* 客户程序开始建立 sockfd描述符 */
   if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    fprintf(stderr,"socket Error:%s\a\n",strerror(errno));
     exit(1);
   }
   /* 客户程序填充服务端的资料 */
   bzero(&srvaddr,sizeof(srvaddr));
  srvaddr.sin_family=AF_INET;
   srvaddr.sin_port=htons(atoi(argv[2]));
  if (inet_pton(AF_INET, argv[1], &srvaddr.sin_addr) <= 0){
     fprintf(stderr,"inet_pton Error:%s\a\n",strerror(errno));
    exit(1);
   }
  /* 客户程序发起连接请求 */
  if(connect(sockfd,(struct sockaddr *)(&srvaddr),sizeof(struct sockaddr))==-1){
     fprintf(stderr,"connect Error:%s\a\n",strerror(errno));
    exit(1);
   }
  /* 连接成功了 */
  if((nbytes=read(sockfd,buf,1024))==-1){
    fprintf(stderr,"read Error:%s\n",strerror(errno));
    exit(1);
  }
   buf[nbytes]='\0';
  printf("received data:%s\n",buf);
   /* 结束通讯 */
  close(sockfd);
  exit(0);
}

四.上述程序存在的问题
先运行上述程序的服务端程序,再运行客户端程序,可以得到如下结果:
服务器端结果:
viidiot@ubuntu:~/code $ ./srv
Server get connection from 192.168.1.153
Server get connection from 127.0.0.1
Server get connection from 192.168.1.153
客户器端结果:
viidiot@ubuntu:~/code $ ./cli 192.168.1.153 1113
received data:Hi,welcome to linux-code!
我们完成了一个简单的网络通信程序,该程序使用的io模型为同步(synchronous)阻塞(blocking)。服务器端调用accept(),write()等函数,如果没有客户端连接过来或者相应的文件描述符没有准备好写,程序就会在那里死死的等待,什么事情也不干。在实际应用中,这类程序是很少出现的。实际中使用的都是异步io模型。

到此,相信大家对"如何使用linux网络编程用到的网络函数"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

程序 服务 网络 客户 服务器 文件 客户端 函数 通信 通讯 端的 成功 代码 套接字 情况 传输 实际 长度 监听 网络编程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全系统图片 互联网金融科技股票有哪些 wins 服务器 作用 蓝思网络技术有限公司股票 处女座适合做软件开发 湖南省网络安全与信息化条例 iis服务器管理器角色 工业园区推广网络技术哪个好 沧州定制软件开发 理查德的软件开发指南 纯软件开发有哪些方向 腾讯账户安全人工服务器 蒸汽dota2总是与服务器断开 查阅文献资料的数据库或网站 万方数据库文章被删了 网络安全宣传周图片一年级 苏州可视化智慧消防软件开发 计算机网络安全方面的威胁 魔兽怀旧哪个服务器不排队 太湖网络安全保护 将数据库从sql sql数据库应用技术知识 嘉定区市场软件开发服务电话 代理服务器编写 网络安全寄语校园 软件开发者是做什么的 谁建立和完善网络安全标准体系 武汉大学国家网络安全学院崔晓晖 怎么访问其他的数据库表 厦门直播卖东西软件开发
0