博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Part 1 start network programming:chapter one:1.1理解网络编程和套接字
阅读量:3936 次
发布时间:2019-05-23

本文共 3826 字,大约阅读时间需要 12 分钟。

主要内容概览:

大致看一下套接字的使用方法

相关函数:socket bind listen accept connect

#include 
int socket(int domain,int type,int protocol); 成功返回文件描述符,失败返回-1
#include 
int bind(int sockfd,struct sockaddr *myaddr,socklen_taddrlen); 成功返回0,失败返回-1
#include 
int listen(int sockfd,int backlog); 成功返回0,失败返回-1
#include 
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
#include 
int connect(int sockfd,struct sockaddr* aerv_addr,socklen_t addrlen);成功返回0,失败返回-1

正文

1.1 理解网络编程和套接字

概要:

网络编程:编写程序是两台联网的结算及相互交换数据

套接字(socket):网络数据传输用的软件设备

构建接电话套接字:

  1. 调用socket函数(安装电话机):下面的函数创建的就是相当于电话机的套接字
#include 
int socket(int domain,int type,int protocol); 成功返回文件描述符,失败返回-1
  1. 调用bind函数(分配电话号码):用下面函数给创建好的套接字分配地址信息(IP地址和端口号
#include 
int bind(int sockfd,struct sockaddr *myaddr,socklen_taddrlen); 成功返回0,失败返回-1

调用bind函数给套接字分配地址后,基本完成了接电话的准备工作,下面来连接电话线并等待来电

  1. 调用listen函数(连接电话线):一旦连接电话线,表示电话机为可接听状态,这是其他人可以拨打电话请求连接到该电话机,同样,这个函数就是把套接字转换成可接受连接的状态
#include 
int listen(int sockfd,int backlog); 成功返回0,失败返回-1
4. 调用accept函数(拿起话筒):意味着接受了对方的连接请求,套接字同样如此,如果有人为了完成数据传输而请求连接,就需要调用以下的函数进行受理
#include 
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

总结一下:网络编程中接受连接请求的套接字创建过程如下

  1. 调用socket函数创建套接字
  2. 调用bind函数分配ip地址和端口号
  3. 调用listen函数转为可接受请求状态
  4. 调用accept函数受理连接请求

构建打电话套接字:

上面的是服务器端创建的 服务器端套接字(监听/listening套接字)

接下来是用于请求连接的客户端套接字 connect() 函数

打电话(请求连接)函数,它调用的是客户端套接字

#include 
int connect(int sockfd,struct sockaddr* aerv_addr,socklen_t addrlen);成功返回0,失败返回-1

客户端程序只有"调用socket函数创建套接字"和"调用connect函数向服务器发送连接请求" 这两个步骤

下面是测试程序

1. 服务器端:hello_server.c

#include 
#include
#include
#include
#include
#include
void error_handling(char *message);int main(int argc, char *argv[]){ int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; socklen_t clnt_addr_size; char message[] = "Hello world"; if(argc != 2){ printf("Usage: %s
\n", argv[0]); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(serv_sock == -1){ error_handling("socket() error"); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); if(bind(serv_sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){ error_handling("bind() error"); } if(listen(serv_sock, 5) == -1){ error_handling("listen() error"); } clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if(clnt_sock == -1){ error_handling("accept() error"); } write(clnt_sock, message, sizeof(message)); close(clnt_sock); close(serv_sock); return 0;}void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1);}

2. 客户端程序 hello_client.c

#include 
#include
#include
#include
#include
#include
void error_handling(char *message);int main(int argc, char *argv[]){ int sock; struct sockaddr_in serv_addr; char message[] = "Hello world"; int str_len; if(argc != 3){ printf("Usage: %s
\n", argv[0]); exit(1); } sock = socket(PF_INET, SOCK_STREAM, 0); if(sock == -1){ error_handling("socket() error"); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); if(connect(sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){ error_handling("bind() error"); } str_len = read(sock,message,sizeof(message) - 1); if(str_len == -1){ error_handling("read() error!"); } printf("message from server : %s\n",message ); close(sock); return 0;}void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1);}

在Linux平台下运行

调用结果展示:

在这里插入图片描述

转载地址:http://ljzwi.baihongyu.com/

你可能感兴趣的文章
memcache的安装及管理
查看>>
git 传输
查看>>
创建新项目
查看>>
印刷工艺- 喷墨印刷
查看>>
印刷工艺流程
查看>>
印刷业ERP启蒙
查看>>
Java8 Lambda表达式使用集合(笔记)
查看>>
Java魔法师Unsafe
查看>>
spring cloud java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
查看>>
Centos系统安装MySQL(整理)
查看>>
postgresql计算两点距离(经纬度地理位置)
查看>>
postgres多边形存储--解决 Points of LinearRing do not form a closed linestring
查看>>
postgresql+postgis空间数据库总结
查看>>
spring 之 Http Cache 和 Etag(转)
查看>>
基于Lucene查询原理分析Elasticsearch的性能(转)
查看>>
HttpClient请求外部服务器NoHttpResponseException
查看>>
springCloud升级到Finchley.RELEASE,SpringBoot升级到2.0.4
查看>>
Spring boot + Arthas
查看>>
omitted for duplicate jar包冲突排查
查看>>
如何保证缓存与数据库的双写一致性?
查看>>