文章目录

  • 前言
  • 一、Linux - Linux
    • 服务器 server
    • 客户端 client
    • 通信实操
  • 二、socket编程在windows和linux下的区别
  • 三、Windows - Linux
  • 四、程序源码

前言

阅读本篇前 请先具备socket编程与TCP协议相关基础,可移步
“ Socket编程基础 ”、“ TCP传输控制协议 ”进行知识充能。

一、Linux - Linux

服务器 server

① 调用 socket()函数打开套接字,得到套接字描述符;

//创建一个socket文件,也就是打开一个网络通讯端口,类型是IPV4(AF_INET)+TCP(SOCK_STREAM)int serv_sock = socket(AF_INET, SOCK_STREAM,0);

② 调用 bind()函数将套接字与 IP 地址、端口号进行绑定;

 struct sockaddr_in serv_addr;//ipv4,使用结构体地址类型sockaddr_inmemset(&serv_addr, 0, sizeof(serv_addr));//先清空初始值serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//本机ip环回地址,这里还可以使用inet_pton函数进行地址转换serv_addr.sin_port = htons(8899);//可自定义一个端口8899(一选择大于5000)bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));  //绑定

③ 调用 listen()函数让服务器进程进入监听状态;

listen(serv_sock,3); //设置最大连接数为3

④ 调用 accept()函数获取客户端的连接请求并建立连接;

int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

⑤ 调用 read、write 与客户端进行通信;

read(clnt_sock,recv_buf,sizeof(recv_buf)-1);
write(clnt_sock,tmp,sizeof(tmp));

⑥ 调用 close()关闭套接字。

close(clnt_sock);
close(serv_sock);

客户端 client

① 调用 socket()函数打开套接字,得到套接字描述符;

//创建socket,用于和服务端通信int sock = socket(AF_INET, SOCK_STREAM, 0);

② 指定服务器ip与端口;

 struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("192.168.1.181");//注意,这里是服务端的ip和端口serv_addr.sin_port = htons(8899);

③ 调用 connect 连接远端服务器;

connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))

④ 调用 read、write 与服务器进行通信;

read(sock,recv_buf,sizeof(recv_buf)-1);
write(sock,send_buf,sizeof(send_buf));

⑤ 调用 close()关闭套接字。

close(sock);   //断开连接

通信实操

  1. 进入Linux平台下编译好的文件夹中,同时打开俩个终端,对已敲好的服务器、客户端程序分别进行编译、运行

    先运行服务器端的程序,然后再运行客户端,可以看出,上面服务器与客户端连接成功,接下来试试传输数据吧

    可见,通信成功!

二、socket编程在windows和linux下的区别

  • 1. 头文件
// Linux头文件主要包含#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>// windows下则是包含#include <Winsock2.h>#pragma comment(lib,“Ws2_32.lib”)
  • 2. 初始化

windows下需要用WSAStartup();linux下不需要
对应的退出清理用WSACleanup( );linux下不需要

 WSADATA s; // 用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息  if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通过连接两个给定的无符号参数,首个参数为低字节,使用2.2版本的Socket{printf("Init Windows Socket Failed! Error: %d\n", GetLastError());getchar();return -1;}WSACleanup( );
  • 3. socket套接字类型

Linux中socket为整形,
Windows中为一个SOCKET类型。

int sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
  • 4. 收发数据
    Linux中使用read和write
    windows中使用recv和send
send(sock,send_buf,sizeof(send_buf),0);
recv(sock,recv_buf,sizeof(recv_buf)-1,0);
  • 5. 获取错误码
    windows下WSAGetLastError() ;
    linux下设置errno变量 用geterror()取得错误码;
printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
  • 6. 设置socket属性
    Linux下为 fcntl (fd, F_SETFL, flag | O_NONBLOCK);
    Windows下为 ioctlsocket (fd, FIONBIO, (unsigned long *) &flag);

  • 7. 毫秒级时间获取
    windows下 GetTickCount()
    linux下 gettimeofday()

  • 8. WSA宏
    windows下WSA相关的操作
    linux下WSA相关的操作在Linux不必要,直接去掉即可

  • 9. 多线程

 //(windows) ------------ (linux)process.h   ---->  pthread.h_beginthread ---->  pthread_create_endthread   ---->  pthread_exit

三、Windows - Linux

该部分可根据 Linux-Linux 下的程序进行修改,其通信原理一毛一样,所以这个就留给读者做课后作业吧。

四、程序源码

若需程序源码可留言评论区或直接私信 即可。

基于Socket编程下 实现Linux-Linux、Linux-Windows tcp通信相关推荐

  1. Socket编程(简单(C++)实现TCP通信)

    一.什么是socket? socket顾名思义就是套接字的意思,用于描述地址和端口,是一个通信链的句柄.应用程序通过socket向网络发出请求或者回应. socket编程有三种,流式套接字(SOCK_ ...

  2. socket recv 服务端阻塞 python_网络编程(基于socket编程)

    网络编程(基于socket编程) socket套接字:应用程序通常通过socket"套接字"向网络发送请求或应答网络请求,是主机间或同一计算机中的进程间相互通讯 socket是介于 ...

  3. C# Winform基于socket编程的五子棋游戏(带聊天和发送文件功能)

    最近在做课设,题目是关于socket编程的一对一网络小游戏.期间遇到各种问题,也从中学到了很多.在此记录下课设中遇到的问题. 题目要求: 设计4 网络版小游戏 1 设计目的 1)熟悉开发工具(Visu ...

  4. .NET(C#)基于Socket编程实现平行主机之间网络通讯有图片传输的Demo演示

    本文讲下C#通过Socket编程实现平行主机之间网络通讯的详细讲解,非常不错的博文,一起来看下吧.      在程序设计中,涉及数据存储和数据交换的时候,不管是B/S还是C/S模式 ,都有这样一个概念 ...

  5. C++socket编程(五):5.2 tcp编程总结

    如下图:整个流程 一句话总结: 客户端:第一步创建socket套接字,注意整个socket除了指定协议,绑定端口号,ip等还能指定阻塞方式. 第二步connect建立连接,也即完成了三次握手. 然后s ...

  6. Linux socket编程(二) 服务器与客户端的通信

    http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html 上一篇写了对套接字操作的封装,这一节使用已封装好的Socket类实现服务器与客户 ...

  7. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器

    早期网络刚刚普及的时候,给人们印象最深的就是上网聊天,虽然作为一名上世纪的尾巴刚刚出生的我没有经历过,但仍从有所耳闻,那个时期是网络聊天室风靡的年代,全国知名聊天室大家都争破头的想要进去,基于如上和一 ...

  8. 使用C++基于Socket编程实现文件下载(改进-封装成类)

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,输入要传输文件到哪个目标机器的IP地址: (3)输入传输文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含( ...

  9. 使用C++基于Socket编程实现文件下载

    使用: (1)首先运行服务端,待服务端运行起来: (2)最后运行客户端,这里使用目标机器IP地址是本机: (3)输入下载文件的路径及文件(完成的路径),其中包含文件的类型,也就是后缀需要包含(代表需要 ...

最新文章

  1. 中国国产万亿次高性能计算机向产业化迈进
  2. hash 建表 query 统计重复个数
  3. 番茄花园该打,反垄断更该升级
  4. ASP截取字符 截取字符之间的字符
  5. linux组群账户存放在,linux用户和群组
  6. Document Builder: Error message No virus scan provider available for scanner group CXP_VSCAN
  7. 我2017年游泳特训安排
  8. mysql 5.8_mysql5.8安装指南
  9. 飞鸽传书开发者都在为生计发愁?
  10. 深入理解Android(二):Java虚拟机Dalvik
  11. 通过DBLINK跨数据库查询,同步创建表结构,插入表数据
  12. Dart判断字符串是否为空
  13. 基于Arduino和Mixly(超声波+蜂鸣器)实现距离报警
  14. 宽带拨号上服务器无响应,宽带拨号服务器无响应(图文)
  15. 子类可以重新定义父类的同名方法,并且允许他们有不同的返回值类型吗?
  16. Django 2.1文档
  17. Android Q适配攻略(五)(存储权限变更)
  18. 单片机遥控车c语言程序,基于51单片机的无线遥控小车设计[附发射接收程序]
  19. BGP选路负载分担的架构设计
  20. 群发短信平台哪个好?推荐阿里云短信平台

热门文章

  1. java 获取mysql timestamp_java获取获得Timestamp类型的当前系统时间
  2. Zip文件压缩和解压功能
  3. java ssm项目心得总结_SSM整合,个人总结和step
  4. vue-devtools安装教程(简单易上手)
  5. 空心线圈绕线机发展方向
  6. 第九篇 Java多线程
  7. 安装kismet2022最新版本步骤以及报错--没装成功,大家不要看啦,应该是缺少了依赖的问题,这里仅作个人记录!!!需要安装的可以参考内页官网
  8. 完成Prometheus其他功能模块与mavros节点进行数据交互的uav_control_node介绍
  9. hog matlab,matlab hog+svm代码
  10. AppEmit v0.9.5 新功能 浏览器调用本地应用程序 支持打开 编辑 金山 wps office, excel ppt