• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > linux编程之socket

linux编程之socket

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了linux socket编程,linux下socket编程,linux socket编程实例,linux socket网络编程,linux udp socket编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

linux编程之socket


TCP/IP协议及socket封装

socket编程的基本流程


socket连接的建立(3次握手)

socket连接的断开(3次握手)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

对应函数接口如图:

http://www.bkjia.com/uploads/allimg/161101/11551V4J-4.png?201575154548

socket编程之bind函数
int bind(int sockfd, const struct sockaddr *addr,socklen_t *addrlen);

功能描述:

当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfd。addrlen指定了以addr所指向的地址结构体的字节长度。一般来说,该操作称为“给套接字命名”。

通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名。

备注:

调用bind()函数之后,为socket()函数创建的套接字关联一个相应地址,发送到这个地址的数据可以通过该套接字读取与使用。
备注:
bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind()函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用bind()函数,对于客户进程则不需要调用bind()函数。


socket编程之accept函数

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);



功能参数描述


accept()系统调用主要用在基于连接的套接字类型,比如SOCK_STREAM和SOCK_SEQPACKET。它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符。新建立的套接字不在监听状态,原来所监听的套接字也不受该系统调用的影响。


备注:
新建立的套接字准备发送send()和接收数据recv()。


参数:


sockfd, 利用系统调用socket()建立的套接字描述符,通过bind()绑定到一个本地地址(一般为服务器的套接字),并且通过listen()一直在监听连接;


服务器代码:

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include

  11. #define QUEUE20
  12. #define MYPORT8887
  13. #define BUFF_SIZE1024

  14. int main(int argc, char *argv[])
  15. {
  16. int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);// 定义socket fd

  17. // 定义sockaddr_in
  18. struct sockaddr_in server_sockaddr;
  19. server_sockaddr.sin_family = AF_INET;
  20. server_sockaddr.sin_port = htons(MYPORT);// host to network short
  21. server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);// host to network long

  22. // bind socket address to socket fd
  23. if (bind(server_sockfd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) == -1) {
  24. perror("bind");
  25. exit(1);
  26. }

  27. if (listen(server_sockfd, QUEUE) == -1) {
  28. perror("listen");
  29. exit(2);
  30. }

  31. // 客户端套接字
  32. char buff[BUFF_SIZE];
  33. struct sockaddr_in client_addr;
  34. socklen_t length = sizeof(client_addr);

  35. // 监听并返回客户端fd
  36. int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
  37. if (conn < 0) {
  38. perror("accept");
  39. exit(3);
  40. }

  41. while (1) {
  42. memset(buff, 0, sizeof(buff));
  43. int len = recv(conn, buff, sizeof(buff), 0);

  44. if (strcmp(buff, "exit\n") == 0)
  45. break;

  46. printf("server received:%s", buff);
  47. send(conn, buff, len, 0);
  48. }

  49. close(conn);
  50. close(server_sockfd);
  51. return 0;
  52. }
客户端代码:

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include


  11. #define MYPORT 8887
  12. #define BUFF_SIZE 1024

  13. int main()
  14. {
  15. int sock_client_fd = socket(AF_INET, SOCK_STREAM, 0);

  16. // 定义server socket
  17. struct sockaddr_in server_addr;
  18. memset(&server_addr, 0, sizeof(0));
  19. server_addr.sin_family = AF_INET;
  20. server_addr.sin_port = htons(MYPORT);
  21. server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// 服务器ip

  22. // 连接服务器
  23. if (connect(sock_client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
  24. perror("connect");
  25. exit(1);
  26. }

  27. char sendbuff[BUFF_SIZE], recvbuff[BUFF_SIZE];
  28. while (fgets(sendbuff, sizeof(sendbuff), stdin) != NULL){
  29. send(sock_client_fd, sendbuff, strlen(sendbuff), 0);// 发送
  30. if (strcmp(sendbuff, "exit\n") == 0) break;

  31. recv(sock_client_fd, recvbuff, sizeof(recvbuff), 0);
  32. printf("client received:%s", recvbuff);

  33. memset(recvbuff, 0, sizeof(recvbuff));
  34. memset(sendbuff, 0, sizeof(sendbuff));
  35. }

  36. close(sock_client_fd);
  37. return 0;
  38. }
tcpcomm.rar


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • linux编程之socket

相关文章

  • 2017-05-26android Android性能优化之如何避免Overdraw,androidoverdraw
  • 2017-05-26kvm性能优化
  • 2017-05-26《Android Studio实用指南》12.18 文本搜索工具
  • 2017-05-26android studio下百度地图sdk的初体验
  • 2017-05-26Apache Cordova开发Android应用程序——番外篇,cordovaandroid
  • 2017-05-26【原】tinker dex文件格式的dump工具tinker-dex-dump,dextinker-dex-dump
  • 2017-05-26TCP的三次握手,TCP三次握手
  • 2017-05-26Android仿QQ界面,android仿界面
  • 2017-05-26高仿人人网客户端Android版项目源码,高仿android
  • 2017-05-26DataPicker以及TimePicker显示时间和日期(屏幕上显示),datepicker日期格式

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • android常用框架收录,android收录
    • Android 手机卫士--导航界面2,android卫士
    • android开发网络连接工具类(一),android工具类
    • Android 面试题总结(二)
    • MTK处理器手机 解锁Bootloader 教程,mtkbootloader
    • Android系统四层架构分享,android四层架构
    • 谷歌电子市场3--应用,谷歌电子市场3--
    • 开源图表库MPAndroidChart使用介绍之饼状图&amp;折线图&amp;柱状图,图表mpandroidchart
    • Android自定义控件(二),android自定义控件
    • Android中BroadcastReceiver的两种注册方式(静态和动态)详解,broadcastreceiver

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有