TCP/IP网络编程系列之一(初级)
2024-10-21 04:02:53
概述
网络编程实际上就是编写程序使两台联网的计算机相互的交换数据。操作系统会提供名为“ 套接字 ”的部件。套接字是网络数据传输的软件设备,即使对网络数据传输原理不太熟悉也无关紧要。我们也能通过套接字完成数据传输,因此网络编程又叫套接字编程。
过程
我们可以把套接字理解为我们平时的电话机,我们先看一下套接字的创建过程:
- 首先你如果要和别人沟通肯定要安装好电话机才可以,所以对应套接字的是调用socket函数时进行对话。
#include<sys/socket.h>
int socket(int domain,int type,int protocol)
成功时返回文件描述符,失败时返回-1.
2. 其次调用bind函数分配电话号码进行对话,所以用到bind函数,实际上分配的是ip地址。
#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen)
成功时返回0,失败返回-1
3. 调用listen函数进行进行连线对话。
int listen(int sockfd,int backlog)
成功时返回0,失败时返回-.
4.调用accept函数进行对话
int accept(int skckfd,struct sockaddr *addr,socklen_t *addrlen)
成功时返回文件描述符,失败时返回-.
总结一下:
- 调用socket函数创建套接字,为通话准备条件。
- 调用bind函数分配ip地址和端口,从而确定地址。
- 调用listen函数转为可接受请求状态。
- 调用accept函数受理连接请求。
代码实现(基于LINUX)
编写服务端代码,服务端是能够受理连接请求的程序,该服务端收到连接请求之后向请求者返回"Hello!"。先不用关注语言细节,先把整个套接字编程的整个过程熟悉一遍。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> void Error_Handling(char *message); int main(int argc,char *argv[])
{
int serverSocket;
int clientSocket;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
socklen_t clientSocketAddrSize;
char message []="Hello!";
if(argc != )
{
printf("Usage:%s <port>\n",argv[]);
exit();
}
serverSocket = socket(PF_INET,SOCK_STREAM,);
if(serverSocket == -)
{
Error_Handling("socket() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
serverAddr.sin_port=htons(atoi(argv[]));
if(bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("bind() error"); }
if(listen(serverSocket,)==-)
{
Error_Handling("listen() error");
}
clientSocketAddrSize = sizeof(clientAddr);
clientSocket = accept(serverSocket,(struct sockaddr*)&clientAddr,&clientSocketAddrSize);
if(clientSocket == -)
{
Error_Handling("accept() error"); }
write(clientSocket,message,sizeof(message));
close(clientSocket);
close(serverSocket);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
套接字服务端程序
注解:
- 第23行:调用socket函数创建套接字。
- 第32行:调用bind函数分配IP地址和端口号
- 第37行:调用listen函数套接字转为可接受链接状态。d
- 第42行:调用accept函数受理请求连接。如果在没有连接请求的情况系调用该函数,则不会返回,知道有链接请求为止。
- 第48行:write函数用于传输数据。
构建打电话套接字(编写客户端代码)
服务器端创建的套接字又称为服务器套接字或监听程序套接字。客户端套接字的创建过程比服务器端套接字简单。
请求连接的函数,因为其调用的是客户端套接字。
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
成功时返回0,失败时返回-.
客户端套接字程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define MAXSIZE 30
void Error_Handling(char* message); int main(int argc,char* argv[])
{
int sock;
struct sockaddr_in serverAddr;
char message[MAXSIZE];
int str_len;
if(argc != )
{
printf("Usage : %s <IP> <Port> \n",argv[]);
exit();
}
sock = socket(PF_INET,SOCK_STREAM,);
if(sock == -)
{
Error_Handling("sock() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=inet_addr(argv[]);
serverAddr.sin_port=htons(atoi(argv[]));
if(connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("connect() error");
} str_len = read(sock,message,sizeof(message)-);
if(str_len == -)
{
Error_Handling("read error");
}
printf("Message from server : %s \n",message);
close(sock);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
客户端套接字程序
linux 平台运行(我的环境时Debian 7)
此时服务端在等待请求,然后先打开一个窗口并运行客户端代码,然后如下图所示
1.在有些函数里面成功时返回文件描述符,其中文件描述符也叫文件句柄
文件描述符 | 对象 |
0 | 标准输入:Standard Input |
1 | 标准输出:Standard Output |
2 | 标准错误:Standard Error |
要想了解具体代码含义,轻耐心等待下一篇博客(套接字类型和协议设置)!
参考书籍:
《Unix 网络编程》
《TCP/IP 网络编程》
最新文章
- 大数据平台R语言web UI应用架构 设计与开发
- 微信开发之.Net
- python 代码片段19
- UINavigationController详解一(转)UIBarButtonItem
- Gson把json串转换成java实体对象
- editplus配置详:
- TP5.0 excel 导入导出
- 使用Puppeteer抓取受限网站
- Python的变量以及类型
- MySQL5.5 安装配置方法教程
- ASP.NET Web API 2 过滤器
- Dropping tests [POJ2976] [01分数规划]
- RE validator
- 给tableView设置背景图片
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-4 底层驱动之ADC、DAC
- 修改input placeholder样式
- input标签file文件上传图片本地预览
- Windows窗体技术
- 真实赛车3,FERRARI之魂不买FERRARI 599 GTO可以解锁顶点系列。
- Selenium自动化测试之数据驱动及用例管理
热门文章
- C#编程 XML文档
- Mybatis是什么?mybatis中的对一和对多关系怎么配置
- Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)
- [转贴]Linux内核LTS长期支持版生命周期
- 基于 Vue.js 2.0 酷炫自适应背景视频登录页面的设计『转』
- 2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
- Git 实习一个月恍然大悟合集
- 用python操作mysql数据库
- 从入门到自闭之Python自定义模块
- linux常见的安装软件包命令