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. [Git] 021 来一颗“恶魔果实”?

    0. 前言 需要新的功能时,一般会新建一条 "feature" 分支(尴尬的是,我第一眼看时,看成了 "future") 在 "feature&quo ...

  2. [转帖]Intel Xeon路线图:7nm处理器要上DDR5、PCIe 5.0

    Intel Xeon路线图:7nm处理器要上DDR5.PCIe 5.0 https://www.cnbeta.com/articles/tech/849631.htm 在月初的投资者会议上,Intel ...

  3. 前端导出excel文件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. P1076寻宝

    ---恢复内容开始--- 这是2012noip普及组的一个模拟题,第一次得了50,看了题解后剪枝拿到100. N层楼,m个房间,逆时针排序.每个房间有一个指示牌,也可能有楼梯,找到第(上楼的第一个房间 ...

  5. 【JZOJ 3910】Idiot 的间谍网络

    题面: Description 作为一名高级特工,Idiot 苦心经营多年,终于在敌国建立起一张共有n 名特工的庞大间谍网络. 当然,出于保密性的要求,间谍网络中的每名特工最多只会有一名直接领导.现在 ...

  6. CF和OF的区别

    进位标志CF和溢出标志OF的区别: 有符号数和无符号数只是认为的进行区分,计算机从来不区分有符号数和无符号数.对于运算的数来说,只要符合进位的情况,CF就置1.只要符合溢出的情况,OF就置1.但是后续 ...

  7. npm学习(十三)之npm命令

    npm:查看npm所有命令 自己写包可能用到的命令: npm adduser:注册 npm login:登录 npm whami:查看当前用户名 npm init:初始化包的信息 npm publis ...

  8. python之路之——操作系统的发展历史

    阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...

  9. switch语句小练习

    java有两钟选择判断语句,分别是if else和switch case语句. 下面我们做一个switch case语句的练习. // 定义一个扫描器 Scanner sacnner = new Sc ...

  10. 内置的configparser模块和hashlib模块

    #configparser模块:配置解析模块 import configparser config = configparser.ConfigParser() #创建一个配置解析对象 config[& ...