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

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

Windows   Client端

     #include <stdio.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
#define Port 5000
#define IP_ADDRESS "192.168.1.30" //服务器地址
int main() // argc是命令行总的参数个数
{
WSADATA s; // 用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息
SOCKET ClientSocket;
struct sockaddr_in ClientAddr; // 一个sockaddr_in型的结构体对象
int ret = ;
char SendBuffer[MAX_PATH]; // Windows的MAX_PATH默认是260
// 初始化Windows Socket
// WSAStartup函数对Winsock服务的初始化
if (WSAStartup(MAKEWORD(, ), &s) != ) // 通过连接两个给定的无符号参数,首个参数为低字节
{
printf("Init Windows Socket Failed! Error: %d\n", GetLastError());
getchar();
return -;
}
while ()
{
// 创建一个套接口
// 如果这样一个套接口用connect()与一个指定端口连接
// 则可用send()和recv()与该端口进行数据报的发送与接收
// 当会话结束后,调用closesocket()
ClientSocket = socket(AF_INET, // 只支持ARPA Internet地址格式
SOCK_STREAM, // 新套接口的类型描述
IPPROTO_TCP); // 套接口所用的协议
if (ClientSocket == INVALID_SOCKET)
{
printf("Create Socket Failed! Error: %d\n", GetLastError());
getchar();
return -;
}
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS); // 定义IP地址
ClientAddr.sin_port = htons(Port); // 将主机的无符号短整形数转换成网络字节顺序
memset(ClientAddr.sin_zero, 0X00, ); // 函数通常为新申请的内存做初始化工作
// 连接Socket
ret = connect(ClientSocket,
(struct sockaddr*)&ClientAddr,
sizeof(ClientAddr));
if (ret == SOCKET_ERROR)
{
printf("Socket Connect Failed! Error:%d\n", GetLastError());
getchar();
return -;
}
else
{
printf("Socket Connect Succeed!");
}
printf("Input Data: ");
while ()
{
scanf("%s", &SendBuffer);
// 发送数据至服务器
ret = send(ClientSocket,
SendBuffer,
(int)strlen(SendBuffer), // 返回发送缓冲区数据长度
);
if (ret == SOCKET_ERROR)
{
printf("Send Information Failed! Error:%d\n", GetLastError());
getchar();
break;
}
break;
}
// 关闭socket
closesocket(ClientSocket);
if (SendBuffer[] == 'q') // 设定输入第一个字符为q时退出
{
printf("Quit!\n");
break;
}
}
WSACleanup();
getchar();
system("pause");
return ;
} Linux server端 #include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include<unistd.h>
#include <cstdlib>
#define SERVER_PORT 5000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 10
int main() // (int argc, char* argv[])
{
struct sockaddr_in server_addr;
int server_socket;
int opt = ;
bzero(&server_addr, sizeof(server_addr)); // 置字节字符串前n个字节为0,包括'\0'
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY); // 转小端,INADDR_ANY就是指定地址为0.0.0.0的地址
server_addr.sin_port = htons(SERVER_PORT);
// 创建一个Socket
server_socket = socket(PF_INET, SOCK_STREAM, );
if (server_socket < )
{
printf("Create Socket Failed!\n");
exit();
}
// bind a socket
setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if(bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)))
{
printf("Server Bind Port: %d Failed!\n", SERVER_PORT);
exit();
}
// 监听Socket
if (listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
{
printf("Server Listen Failed!\n");
exit();
}
while()
{
struct sockaddr_in client_addr;
int client_socket;
socklen_t length;
char Buffer[BUFFER_SIZE];
// 连接客户端Socket
length = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);
if (client_socket < )
{
printf("Server Accept Failed!\n");
break;
}
// 从客户端接收数据
while()
{
bzero(Buffer, BUFFER_SIZE);
length = recv(client_socket, Buffer, BUFFER_SIZE, );
if (length < )
{
printf("Server Recieve Data Failed!\n");
break;
}
if ('q' == Buffer[])
{
printf("Quit!\n");
break;
}
printf("%s\n", Buffer);
break;
}
close(client_socket);
}
close(server_socket);
return ;
}

(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(, ), &wsaData); //新建客户端socket
sockClient = socket(AF_INET, SOCK_STREAM, ); //定义要连接的服务端地址
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( , , CV_8UC3);//CV_8UC3代表是三通道
int imgSize = img.total() * img.elemSize();
uchar *iptr = img.data;
int bytes = ;
int key; //make img continuos if ( ! img.isContinuous() ) {
img = img.clone();
} std::cout << "Image Size:" << imgSize << std::endl;
namedWindow("CV Video Client",);
while (key != 'q') {
if ((bytes = recv(sockClient, (char *)iptr, imgSize , MSG_WAITALL)) == -) {
std::cerr << "recv failed, received bytes = " << bytes << std::endl;
}
cv::imshow("CV Video Client", img);
if (key = cv::waitKey() >= ) break;
}
closesocket(sockClient); WSACleanup(); return ;
}

linux端:
编译命令:

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

     #include "opencv2/opencv.hpp"
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "socketSetting.h"
/*
* Created by Wu yongcong 2017-8-25
*
* socket transfer video server
*
*/
using namespace cv;
using namespace std;
void *display(void *);
VideoCapture cap(CAMMER_PORT); // open the default camera
int main(int argc, char** argv)
{
//--------------------------------------------------------
//networking stuff: socket, bind, listen
//--------------------------------------------------------
int localSocket,
remoteSocket,
port = IP_PORT;
struct sockaddr_in localAddr,
remoteAddr;
pthread_t thread_id;
int addrLen = sizeof(struct sockaddr_in);
localSocket = socket(AF_INET , SOCK_STREAM , );
if (localSocket == -){
perror("socket() call failed!!");
}
localAddr.sin_family = AF_INET;
localAddr.sin_addr.s_addr = INADDR_ANY;
localAddr.sin_port = htons( port );
if( bind(localSocket,(struct sockaddr *)&localAddr , sizeof(localAddr)) < ) {
perror("Can't bind() socket");
exit();
}
//Listening
listen(localSocket , );
std::cout << "Waiting for connections...\n"
<< "Server Port:" << port << std::endl;
//accept connection from an incoming client
while(){
remoteSocket = accept(localSocket, (struct sockaddr *)&remoteAddr, (socklen_t*)&addrLen);
if (remoteSocket < ) {
perror("accept failed!");
exit();
}
std::cout << "Connection accepted" << std::endl;
pthread_create(&thread_id,NULL,display,&remoteSocket);
//pthread_join(thread_id,NULL);
}
//pthread_join(thread_id,NULL);
//close(remoteSocket);
return ;
}
void *display(void *ptr){
int socket = *(int *)ptr;
//OpenCV Code
//----------------------------------------------------------
Mat img, imgGray,imgColor;
img = Mat::zeros(,,CV_8UC3);
//make it continuous
if (!img.isContinuous()) {
img = img.clone();
}
// int imgSize = img.total() * img.elemSize();
int imgSize = img.total() * img.channels();
int bytes = ;
int key;
//make img continuos
if ( !img.isContinuous() ) {
img = img.clone();
imgGray = img.clone();
}
std::cout << "Image Size:" << imgSize << std::endl;
while() {
/* get a frame from camera */
cap >> img;
if (img.empty()) break;
//cvtColor(img, imgGray, CV_RGB2GRAY); // color change
//send processed image
if ((bytes = send(socket, img.data, imgSize, )) < ){
std::cerr << "bytes = " << bytes << std::endl;
break;
}
}
}








												

(8)Linux(客户端)和Windows(服务端)下socket通信实例的更多相关文章

  1. 使用rsync在windows(服务端)与linux(客户端)之间同步

    说明: 1.cwRsyncServer服务端 系统:Windows7 IP地址:192.168.0.110 2.Rsync客户端 系统:CentOS 6.7 IP地址:192.168.0.141 实现 ...

  2. Linux下更改oracle客户端字符集和服务端字符集

    from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 or ...

  3. Android客户端与PHP服务端交互(一)---框架概述

    背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...

  4. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...

  5. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  6. 利用python多线程实现多个客户端与单个服务端的远程ssh

    本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...

  7. android客户端app和服务端交互token的作用

    Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44   对于初学者来说,对Token和Session的 ...

  8. XFire客户端调用CXF服务端(四)

    前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...

  9. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. Canvas入门01-基础知识

    定义一个canvas,直接在Html中使用canvas便签即可. <!DOCTYPE html> <html lang="en"> <head> ...

  2. HTTPS测试

    1.首先理解HTTPS的含义,清楚http与HTTPS的区别 2.相对于http而言,https更加安全,因 3.使用数字证书使传输更安全,数字证书使用keytool工具生成 测试准备: 创建公钥和秘 ...

  3. 【转】MySQL查询缓存详解

    [转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...

  4. springBoot 静态变量@value取不到值

    在工具类中给静态变量初始化值,使用了springBoot的@Value注解,但是没有赋值成功,得到的是null @Value("${jdbc.url}")private stati ...

  5. python 元组及操作

    # 元组是'不可变'的 list 使用小括号 创建后不允许修改 # 创建# t = ('a','b','c',1,2,3)# print(t)# print(type(t))# # 3# print( ...

  6. 给Repeater增加button事件,并绑定值

    ASPX页面: 增加两个事件,及传值. 1<asp:Repeater ID="rptList" OnItemDataBound="rptList_ItemDataB ...

  7. ECMAScrip5 二

    一.ES5的严格模式 在严格模式下,声明变量必须使用 var 在严格模式下,不能使用八进制 在严格模式下,不能使用arguments.callee 在严格模式下,不能使用eval()    //eva ...

  8. ThinkPHP中的"路由"是什么意思?

    路由(route)是指根据url, 分配到对应的处理程序的映射. 简单来说,就是一个路径的解析,根据客户端提交的路径,将请求解析到相应的模块/控制器/方法上. 转载自:https://blog.csd ...

  9. Thinkphp5 手册

    thinkphp5 手册 https://www.kancloud.cn/manual/thinkphp5/118003

  10. 10年前文章_iscsi initiator 设置

    发现和查找 target, iscsiadm -m discovery -t sendtargets -p 192.168.1.1:3260 登录 iscsiadmin -m node -l 退出登录 ...