Linux socket网络编程基础 tcp和udp
Socket TCP网络通信编程
首先,服务器端需要做以下准备工作:
(1)调用socket()函数。建立socket对象,指定通信协议。
(2)调用bind()函数。将创建的socket对象与当前主机的某一个IP地和端口绑定。
(3)调用listen()函数。使socket对象处于监听状态,并设置监听队列大小。
客户端需要做以下准备工作:
(1)调用socket()函数。建立socket()对象,指定相同通信协议。
(2)应用程序可以显式的调用bind()函数为其绑定IP地址和端口,当然,也可以将这工作交给TCP/IP协议栈。
接着建立通信连接:
(1)客户端调用connect()函数。向服务器端发出连接请求。
(2)服务端监听到该请求,调用accept()函数接受请求,从而建立连接,并返回一个新的socket文件描述符专门处理该连接。
然后通信双方发送/接收数据:
(1)服务器端调用write()或send()函数发送数据,客户端调用read()或者recv()函数接收数据。反之客户端发送数据,服务器端接收数据。
(2)通信完成后,通信双方都需要调用close()或者shutdown()函数关闭socket对象。
类比电话通信,面向连接的socket通信实现图
展示一个代码示例:
服务端:
#include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<string.h> #include<unistd.h> #include <arpa/inet.h> #include<pthread.h> static void usage(const char *proc) { printf("Please use :%s [IP] [port]\n",proc); } void thread_run(void *arg) { printf("creat a new thread\n"); int fd = (int)arg; ]; ){ memset(buf,'\0',sizeof(buf)); ssize_t _s = read(fd,buf,); ){ buf[_s] = '\0'; printf("client say : %s\n",buf); } memset(buf,'\0',sizeof(buf)); printf("please Enter: "); fflush(stdout); ssize_t _s2 = read(,buf,); ){ write(fd,buf,strlen(buf)); } } } int main(int argc,char *argv[]) { ){ usage(argv[]); exit(); } //1.creat socket ); ){ perror("creat socket error\n"); ; } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port = htons(atoi(argv[])); local.sin_addr.s_addr = inet_addr(argv[]); //2.bind ){ perror("bind error\n"); close(sock); ; } //3.listen ) < ){ perror("listen error\n"); close(sock); ; } printf("bind and listen success!wait accept...\n"); //4.accept struct sockaddr_in peer; socklen_t len = sizeof(peer); ){ int fd = accept(sock,(struct sockaddr*)&peer ,&len); ){ perror("accept error\n"); close(sock); ; } printf("get connect,ip is : %s port is : %d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port)); pthread_t id; pthread_create(&id,NULL,thread_run,(void*)fd); pthread_detach(id); } close(sock); ; }
客户端:
#include<stdio.h> #include<unistd.h> #include<sys/socket.h> #include<sys/types.h> #include<string.h> #include<errno.h> #include<netinet/in.h> #include<arpa/inet.h> static void usage(const char *proc) { printf("please use : %s [ip] [port]\n",proc); } int main(int argc,char *argv[]) { ){ usage(argv[]); exit(); } ); ){ perror("socket error"); ; } struct sockaddr_in remote; remote.sin_family = AF_INET; remote.sin_port = htons(atoi(argv[])); remote.sin_addr.s_addr = inet_addr(argv[]); int ret = connect(sock,(struct sockaddr*)&remote,sizeof(remote)); ){ printf("connect failed:%s\n",strerror(errno)); ; } printf("connect success!\n"); ]; ){ memset(buf,'\0',sizeof(buf)); printf("please enter:"); fflush(stdout); ssize_t _s = read(,buf,); ){ buf[_s - ] = '\0'; write(sock,buf,strlen(buf)); _s = read(sock,buf,); ){ ) == ){ printf("qiut\n"); break; } buf[_s -] = '\0'; printf("%s\n",buf); } } } close(sock); ; }
UDP网络通信编程
客户不与服务器建立链接,而是管使用sendto函数给服务器发送数据报,其中必须指定目的地址(即服务器地址)作为参数。类似的,服务器不接受来自客户的连接,而只管调用
revcfrom函数等待来自某个客户数据的到达。revcfrom将与所接受到的数据报一道返回客户的协议地址,因此服务器可以把响应发送给正确的客户。
//服务端代码示例: #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<string.h> int main(int argc,char *argv[]) { ){ printf(]); ; } ); ){ perror("socket error"); ; } struct sockaddr_in local; local.sin_family = AF_INET; local.sin_port = htons(atoi(argv[])); local.sin_addr.s_addr = inet_addr(argv[]); ){ perror("bind error"); ; } ; struct sockaddr_in peer; socklen_t len = sizeof(peer); ]; while(!done){ memset(buf,'\0',sizeof(buf)); recvfrom(sock,buf,,(struct sockaddr*)&peer,&len); printf("#########################\n"); printf("get a client,socket: %s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port)); printf("client : %s ,echo client!\n",buf); printf("#########################\n"); sendto(sock,buf,,(struct sockaddr*)&peer,len); } ; }
Linux socket网络编程基础 tcp和udp的更多相关文章
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础
IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4
网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 3
使用之前的函数实现的简单聊天程序 TCP协议 双方实时发送/接收消息 实现后的问题: 可能是我虚拟机的IP地址配得有问题吧.在一台电脑上面开两个终端,用127.0.0.1的IP收发可以互通.但是两个虚 ...
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- python全栈开发从入门到放弃之socket网络编程基础
网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
随机推荐
- curl访问nagios中Host Status Details For All Host Groups页面的方法
由于进入nagios要输入用户名与密码才能进入,故用curl模拟输入用户名与密码取得当前所有主机的报警信息: # curl -u nagiosadmin:password http://192.168 ...
- 监控 Linux 性能的 18 个命令行工具[转]
对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并运行是多么的不容易.基于此原因,我们 ...
- Python selenium 一个节点两个关联input
HTML代码: 一个节点两个关联input 多出现于密码框 先需要模拟点击进入第一个input,才能激活第二个input. 代码: driver.find_element_by_name('Text ...
- PHP 第3方评论系统
这段时间,无觅 评论也下线不能使用了. 客户好几个网站使用了.无觅 评论,前面也是用的是多说还是什么,总之也是第3方评论,没想到没过多久,又停止使用了. 没办法,网站还是需要评论系统,一气之下,自己做 ...
- 钉钉自定义机器人配合SVN钩子事件进行消息的推送实践
目前很多公司还是使用SVN(TortoiseSVN)进行版本控制,使用简单,适合管理一般项目.协同办公软件目前钉钉比较成熟,阿里也一直在宣传推广,这两年公司也在使用,主要用于信息的沟通,其它的绩效.考 ...
- rabbitmq的构架和原理(三)
前面两篇博文已经将环境安装和相关配置介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...
- 02_Linux图形界面及文件系统结构介绍
一.根目录 / : 它跟Windows的C.D.E.F不同,在Linux中,所有的文件系统(光驱.U盘.硬盘)都挂载到根目录的某一个文件夹下 bin : 存放二进制可执行文件 sbin ...
- 基于flash的web视频对讲直播测试
由于项目的需求,要在web上实现视频通话的需求.现成的方案有WebRTC,基于浏览器的成熟方案,但是这个方案和公司项目需求有几个点冲突.后来考虑到基于flash的方案.参考雷神的博客 simplest ...
- python扒取百宝彩网站江西快三当日期号及开奖结果
一.环境 windows10+python27 二.需求: 1.获取百宝彩网站中,江西快三当日的开奖期号和中奖号码: 2.根据输入期号,输出开奖号码: 三.上代码 #!/bin/env python ...
- [Sdoi2017]树点涂色 [lct 线段树]
[Sdoi2017]树点涂色 题意:一棵有根树,支持x到根染成新颜色,求x到y颜色数,求x子树里点到根颜色数最大值 考场发现这个信息是可减的,但是没想到lct 特意设计成lct的形式! 如何求颜色数? ...