Linux(客户端)和Windows(服务端)下socket通信实例:

(1)首先是Windows做客户端,Linux做服务端的程序

Windows   Client端

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #pragma comment(lib, "ws2_32.lib")
  4. #define Port 5000
  5. #define IP_ADDRESS "192.168.1.30"     //服务器地址
  6. int main() // argc是命令行总的参数个数
  7. {
  8. WSADATA s; // 用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息
  9. SOCKET ClientSocket;
  10. struct sockaddr_in ClientAddr; // 一个sockaddr_in型的结构体对象
  11. int ret = 0;
  12. char SendBuffer[MAX_PATH]; // Windows的MAX_PATH默认是260
  13. // 初始化Windows Socket
  14. // WSAStartup函数对Winsock服务的初始化
  15. if (WSAStartup(MAKEWORD(2, 2), &s) != 0) // 通过连接两个给定的无符号参数,首个参数为低字节
  16. {
  17. printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
  18. getchar();
  19. return -1;
  20. }
  21. while (1)
  22. {
  23. // 创建一个套接口
  24. // 如果这样一个套接口用connect()与一个指定端口连接
  25. // 则可用send()和recv()与该端口进行数据报的发送与接收
  26. // 当会话结束后,调用closesocket()
  27. ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
  28. SOCK_STREAM, // 新套接口的类型描述
  29. IPPROTO_TCP); // 套接口所用的协议
  30. if (ClientSocket == INVALID_SOCKET)
  31. {
  32. printf("Create Socket Failed! Error: %d\n", GetLastError());
  33. getchar();
  34. return -1;
  35. }
  36. ClientAddr.sin_family = AF_INET;
  37. ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); // 定义IP地址
  38. ClientAddr.sin_port = htons(Port); // 将主机的无符号短整形数转换成网络字节顺序
  39. memset(ClientAddr.sin_zero, 0X00, 8); // 函数通常为新申请的内存做初始化工作
  40. // 连接Socket
  41. ret = connect(ClientSocket,
  42. (struct sockaddr*)&ClientAddr,
  43. sizeof(ClientAddr));
  44. if (ret == SOCKET_ERROR)
  45. {
  46. printf("Socket Connect Failed! Error:%d\n", GetLastError());
  47. getchar();
  48. return -1;
  49. }
  50. else
  51. {
  52. printf("Socket Connect Succeed!");
  53. }
  54. printf("Input Data: ");
  55. while (1)
  56. {
  57. scanf("%s", &SendBuffer);
  58. // 发送数据至服务器
  59. ret = send(ClientSocket,
  60. SendBuffer,
  61. (int)strlen(SendBuffer), // 返回发送缓冲区数据长度
  62. 0);
  63. if (ret == SOCKET_ERROR)
  64. {
  65. printf("Send Information Failed! Error:%d\n", GetLastError());
  66. getchar();
  67. break;
  68. }
  69. break;
  70. }
  71. // 关闭socket
  72. closesocket(ClientSocket);
  73. if (SendBuffer[0] == 'q') // 设定输入第一个字符为q时退出
  74. {
  75. printf("Quit!\n");
  76. break;
  77. }
  78. }
  79. WSACleanup();
  80. getchar();
  81. system("pause");
  82. return 0;
  83. }

Linux server端

  1. #include <stdio.h>
  2. #include <sys/socket.h>
  3. #include <sys/types.h> /* See NOTES */
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <string.h>
  7. #include<unistd.h>
  8. #include <cstdlib>
  9. #define SERVER_PORT 5000
  10. #define LENGTH_OF_LISTEN_QUEUE 20
  11. #define BUFFER_SIZE 10
  12. int main() // (int argc, char* argv[])
  13. {
  14. struct sockaddr_in server_addr;
  15. int server_socket;
  16. int opt = 1;
  17. bzero(&server_addr, sizeof(server_addr)); // 置字节字符串前n个字节为0,包括'\0'
  18. server_addr.sin_family = AF_INET;
  19. server_addr.sin_addr.s_addr = htons(INADDR_ANY); // 转小端,INADDR_ANY就是指定地址为0.0.0.0的地址
  20. server_addr.sin_port = htons(SERVER_PORT);
  21. // 创建一个Socket
  22. server_socket = socket(PF_INET, SOCK_STREAM, 0);
  23. if (server_socket < 0)
  24. {
  25. printf("Create Socket Failed!\n");
  26. exit(1);
  27. }
  28. // bind a socket
  29. setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  30. if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
  31. {
  32. printf("Server Bind Port: %d Failed!\n", SERVER_PORT);
  33. exit(1);
  34. }
  35. // 监听Socket
  36. if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
  37. {
  38. printf("Server Listen Failed!\n");
  39. exit(1);
  40. }
  41. while(1)
  42. {
  43. struct sockaddr_in client_addr;
  44. int client_socket;
  45. socklen_t length;
  46. char Buffer[BUFFER_SIZE];
  47. // 连接客户端Socket
  48. length = sizeof(client_addr);
  49. client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
  50. if (client_socket < 0)
  51. {
  52. printf("Server Accept Failed!\n");
  53. break;
  54. }
  55. // 从客户端接收数据
  56. while(1)
  57. {
  58. bzero(Buffer, BUFFER_SIZE);
  59. length = recv(client_socket, Buffer, BUFFER_SIZE, 0);
  60. if (length < 0)
  61. {
  62. printf("Server Recieve Data Failed!\n");
  63. break;
  64. }
  65. if ('q' == Buffer[0])
  66. {
  67. printf("Quit!\n");
  68. break;
  69. }
  70. printf("%s\n", Buffer);
  71. break;
  72. }
  73. close(client_socket);
  74. }
  75. close(server_socket);
  76. return 0;
  77. }

(2)Windows做服务端,Linux做客户端实例  传输视频

windows端:

#include <stdio.h>
#include <string>
#include <iostream>
#include <Winsock2.h>
#include <opencv2/opencv.hpp>
#include <vector>
#include "globalsetting.h"
#pragma comment(lib,"ws2_32.lib")
/**
 * OpenCV video streaming over TCP/IP
 * Client: Receives video from server and display it
 * Created by Wu yongcong 2017-8-24
 */
using namespace cv;
using namespace std;
int main()
{
    //--------------------------------------------------------
    //networking stuff: socket , connect
    //--------------------------------------------------------
    WSADATA wsaData;
    SOCKET sockClient;//客户端Socket
    SOCKADDR_IN addrServer;//服务端地址
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //新建客户端socket
    sockClient = socket(AF_INET, SOCK_STREAM, 0);
    //定义要连接的服务端地址
    addrServer.sin_addr.S_un.S_addr = inet_addr(SOCKET_IP); //服务端IP
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(SOCKET_PORT);//服务端连接端口
    //连接到服务端
    connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    //----------------------------------------------------------
    //OpenCV Code
    //----------------------------------------------------------
    Mat img;
    img = Mat::zeros(480 , 640, CV_8UC3);//CV_8UC3代表是三通道
    int imgSize = img.total() * img.elemSize();
    uchar *iptr = img.data;
    int bytes = 0;
    int key;
    //make img continuos
    if ( ! img.isContinuous() ) {
          img = img.clone();
    }
    std::cout << "Image Size:" << imgSize << std::endl;
    namedWindow("CV Video Client",1);
    while (key != 'q') {
        if ((bytes = recv(sockClient, (char *)iptr, imgSize , MSG_WAITALL)) == -1) {
            std::cerr << "recv failed, received bytes = " << bytes << std::endl;
        }
        cv::imshow("CV Video Client", img);
        if (key = cv::waitKey(10) >= 0) break;
    }
    closesocket(sockClient);
    WSACleanup();
    return 0;
}
linux端:编译命令:

g++ `pkg-config --cflags opencv` -o server -pthread socketServer.cpp `pkg-config --libs opencv`

  1. #include "opencv2/opencv.hpp"
  2. #include <iostream>
  3. #include <sys/socket.h>
  4. #include <arpa/inet.h>
  5. #include <sys/ioctl.h>
  6. #include <net/if.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <pthread.h>
  12. #include "socketSetting.h"
  13. /*
  14. * Created by Wu yongcong 2017-8-25
  15. *
  16. * socket transfer video server
  17. *
  18. */
  19. using namespace cv;
  20. using namespace std;
  21. void *display(void *);
  22. VideoCapture cap(CAMMER_PORT); // open the default camera
  23. int main(int argc, char** argv)
  24. {
  25. //--------------------------------------------------------
  26. //networking stuff: socket, bind, listen
  27. //--------------------------------------------------------
  28. int localSocket,
  29. remoteSocket,
  30. port = IP_PORT;
  31. struct sockaddr_in localAddr,
  32. remoteAddr;
  33. pthread_t thread_id;
  34. int addrLen = sizeof(struct sockaddr_in);
  35. localSocket = socket(AF_INET , SOCK_STREAM , 0);
  36. if (localSocket == -1){
  37. perror("socket() call failed!!");
  38. }
  39. localAddr.sin_family = AF_INET;
  40. localAddr.sin_addr.s_addr = INADDR_ANY;
  41. localAddr.sin_port = htons( port );
  42. if( bind(localSocket,(struct sockaddr *)&localAddr , sizeof(localAddr)) < 0) {
  43. perror("Can't bind() socket");
  44. exit(1);
  45. }
  46. //Listening
  47. listen(localSocket , 3);
  48. std::cout << "Waiting for connections...\n"
  49. << "Server Port:" << port << std::endl;
  50. //accept connection from an incoming client
  51. while(1){
  52. remoteSocket = accept(localSocket, (struct sockaddr *)&remoteAddr, (socklen_t*)&addrLen);
  53. if (remoteSocket < 0) {
  54. perror("accept failed!");
  55. exit(1);
  56. }
  57. std::cout << "Connection accepted" << std::endl;
  58. pthread_create(&thread_id,NULL,display,&remoteSocket);
  59. //pthread_join(thread_id,NULL);
  60. }
  61. //pthread_join(thread_id,NULL);
  62. //close(remoteSocket);
  63. return 0;
  64. }
  65. void *display(void *ptr){
  66. int socket = *(int *)ptr;
  67. //OpenCV Code
  68. //----------------------------------------------------------
  69. Mat img, imgGray,imgColor;
  70. img = Mat::zeros(480,640,CV_8UC3);
  71. //make it continuous
  72. if (!img.isContinuous()) {
  73. img = img.clone();
  74. }
  75. // int imgSize = img.total() * img.elemSize();
  76. int imgSize = img.total() * img.channels();
  77. int bytes = 0;
  78. int key;
  79. //make img continuos
  80. if ( !img.isContinuous() ) {
  81. img = img.clone();
  82. imgGray = img.clone();
  83. }
  84. std::cout << "Image Size:" << imgSize << std::endl;
  85. while(1) {
  86. /* get a frame from camera */
  87. cap >> img;
  88. if (img.empty()) break;
  89. //cvtColor(img, imgGray, CV_RGB2GRAY); // color change
  90. //send processed image
  91. if ((bytes = send(socket, img.data, imgSize, 0)) < 0){
  92. std::cerr << "bytes = " << bytes << std::endl;
  93. break;
  94. }
  95. }
  96. }

转载于:https://www.cnblogs.com/wycBlog/p/7267415.html

(8)Linux(客户端)和Windows(服务端)下socket通信实例相关推荐

  1. linux远程日志rsyslog服务端和客户端安装(亲测)--自定义接收日志格式

    linux远程日志rsyslog服务端和客户端安装 用rsyslog的缘由:  1.防止系统崩溃无法获取系统日志分享崩溃原因,用rsyslog可以把日志传输到远程的日志服务器上  2.使用rsyslo ...

  2. GIT Windows服务端搭建笔记

    GIT Windows服务端搭建笔记 所需软件: GIT服务端: Bonobo Git Server,下载最新版 https://bonobogitserver.com/ 一:配置服务端(基于Wind ...

  3. Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

    一.Java之socket服务端 新建一个Java工程 命名 给他先创建一个类 在类里面我们做一个main 这里面也需要,创建套接字,IP号,端口号 但是java中有一个类         Serve ...

  4. grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用

    上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...

  5. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  6. 客户端渲染和服务端渲染

    参考链接:客户端渲染和服务端渲染的区别https://blog.csdn.net/qq_40885461/article/details/88539989 浅谈服务端渲染(SSR)https://ww ...

  7. http 缓存分为客户端缓存和服务端缓存

    http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...

  8. 解决android客户端上传图片到服务端时,图片损坏的问题

    解决android客户端上传图片到服务端时,图片损坏的问题 参考文章: (1)解决android客户端上传图片到服务端时,图片损坏的问题 (2)https://www.cnblogs.com/cnbl ...

  9. android socket通信如何抓取,安卓Socket通信实例(客户端、服务端)

    安卓Socket通信实例 本文摘自:https://whatsblog.icu/index.php/Android/17.html 1.Socket通信必须知道的地方 1.首先,Socket通信采用T ...

  10. 附件统一处理starter,含附件客户端和附件服务端

    文章目录 附件统一处理starter,可分别作为附件客户端和附件服务端使用 一 关于项目中附件的概述 二 概要描述 三 附件starter功能划分 3.1 附件服务器,真实的存储附件 3.1.1 为前 ...

最新文章

  1. 关于h5中背景音乐的自动播放
  2. log4j每天生成一份html格式的日志
  3. angular--解决angular图片加载失败问题
  4. hdu Robberies
  5. idea类生成序列号
  6. 高位在前和低位在前区别_前、后级功放、合并功放区别是什么?
  7. (2)I/O流对象-----FilterInputStream与FilterOutputStream
  8. 惠普打印机故障代码_HP激光打印机常见故障代码
  9. 拼多多API接口:item_search - 根据关键词取商品列表
  10. 计算机网络基础课程思政,《计算机网络技术》课程思政融入.pdf
  11. Hyperf JSON RPC 服务 Demo
  12. Dynamics CRM 365 - 零基础入门学习后端插件用法(样例使用方法)
  13. 华硕路由器ddns设置_华硕RT-AC86U路由器怎样设置DDNS 开启DDNS操作方法步骤
  14. android studio 前言中不允许有内容。
  15. AppCan学习笔记
  16. OSChina 周六乱弹 —— 先帝创业未半而花光预算
  17. 使用ECharts加载大数据量数据
  18. python顺时针旋转_python中的绕点旋转(矩阵)
  19. kerberos简介
  20. SC系列 (SC-16S) 低频率小型SMD石英晶振 SC-16S 32.768KHZ 12.5PF/20PPM

热门文章

  1. Confluence 6 为站点启用匿名用户访问
  2. (转)WinForm中的各种表格控件
  3. 解析UML的要点与应用
  4. CMOS checksum error-Defaults loaded 故障解决办法
  5. select下拉框带模糊查询_从零学会SQL:简单查询 -第二节
  6. 如何理解操作系统的不确定性_如何创造可信任的机器学习模型?先要理解不确定性...
  7. C#学习笔记——.NET
  8. 数组中每个元素都出现了两次,但是其中一个元素只出现了一次,求出此元素
  9. Linux系统编程 -- 为什么需要进程间通信??
  10. filebeat配置介绍