【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在公司里面,我们平时使用的机器一般都是windows系统,但是开发、编译的机器往往是linux服务器。通过ping、ftp、samba、telnet、ssh,人们可以很方便与服务器连接。windows系统使用的是windows socket,而linux使用的posix socket,那么这两个socket之间是怎么通信的呢?网上关于windows与windows通信的代码很多,linux与linux通信的代码也很多,但是windows和linux通信的代码很少。这里,我就想写一个简单的socket代码,实现linux和windows的通信。

其实,广义一点看,网页访问、邮箱、游戏、聊天工具都是利用socket实现的,当然后面实现的逻辑要比我们写的代码复杂的多。但是,我们完全可以利用简单的代码来说明socket通信问题,能做到这一点就足够了。这也是我一直推崇的方法,用最简单的代码表达最实际的功能。

windows侧的client代码,

#include <stdio.h>
#include <Windows.h>#pragma comment(lib,"ws2_32.lib")
#define  PORT 4000
#define  IP_ADDRESS "192.168.1.102"int main(int argc, char* argv[])
{WSADATA  Ws;SOCKET ClientSocket;struct sockaddr_in ClientAddr;int Ret = 0;char SendBuffer[MAX_PATH];/* Init Windows Socket */if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 ){printf("Init Windows Socket Failed::%d\n", GetLastError());return -1;}/* Create Socket */ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if ( ClientSocket == INVALID_SOCKET ){printf("Create Socket Failed::%d\n", GetLastError());return -1;}ClientAddr.sin_family = AF_INET;ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);ClientAddr.sin_port = htons(PORT);memset(ClientAddr.sin_zero, 0x00, 8);/* connect socket */Ret = connect(ClientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr));if ( Ret == SOCKET_ERROR ){printf("Connect Error::%d\n", GetLastError());return -1;}else{printf("Connect succedded!\n");}while (1){scanf("%s", SendBuffer);/* send data to server */Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);if ( Ret == SOCKET_ERROR ){printf("Send Info Error::%d\n", GetLastError());break;}if('q' == SendBuffer[0]){break;}}/* close socket */closesocket(ClientSocket);WSACleanup();return 0;}

linux侧的server代码,

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>       #define HELLO_WORLD_SERVER_PORT    4000
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024int main(int argc, char **argv)
{struct sockaddr_in server_addr;int server_socket;int opt = 1;bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);/* create a socket */server_socket = socket(PF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}/* bind socket to a specified address*/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!", HELLO_WORLD_SERVER_PORT); exit(1);}/* listen a socket */if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE)){printf("Server Listen Failed!"); exit(1);}/* run server */while (1) {struct sockaddr_in client_addr;int client_socket;       socklen_t length;char buffer[BUFFER_SIZE];/* accept socket from client */length = sizeof(client_addr);client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);if( client_socket < 0){printf("Server Accept Failed!\n");break;}/* receive data from client */while(1){bzero(buffer, BUFFER_SIZE);length = recv(client_socket, buffer, BUFFER_SIZE, 0);if (length < 0){printf("Server Recieve Data Failed!\n");break;}if('q' == buffer[0]){printf("Quit from client!\n");break;}printf("%s\n", buffer);}  close(client_socket);}close(server_socket);return 0;
}

windows侧的代码使用vc6.0编译就可以,而linux侧的代码用gcc就ok了,即gcc server.c -o server。首先,在linux侧输入./server,然后打开widnows侧的client程序,然后在windows侧的每一个字符输入都会在linux打印出来。如果想退出,输入q即可。但是此时server不会退出,它在等待下一个client的通信,继续服务于大家,就是这么简单。

这里的server和client代码是根据网友的代码修改而来,一并表示感谢。如有侵权,请邮件告知。

随想录(windows和linux进行socket通信)相关推荐

  1. [转]windows和linux进行socket通信

    在公司里面,我们平时使用的机器一般都是windows系统,但是开发.编译的机器往往是linux服务器.通过ping.ftp.samba. telnet.ssh,人们可以很方便与服务器连接.window ...

  2. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  3. windows下linux下socket编程区别

    1. 头文件 windows下winsock.h或winsock2.h linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在i ...

  4. Windows PC和安卓Socket通信,附完整Demo。

    前言:由于要实现将安卓相机的预览数据在PC上处理,所以想到的就是通过socket方式进行通信,PC端采用c#实现.实际测试发现要想高速传输还是有难度,即使用千兆网,目前效果还是不理想.每帧1.5MB的 ...

  5. linux socket ip层配置,Linux下Socket通信(TCP实现)

    近期在做的项目中,涉及到了进程间数据传输,系统的原本实现是通过管道,但是原有的实现中两个进程是在同一台机器,而且两个进程的关系为父子关系,而我们要做的是将其中一个进程移植到服务器上,因此两个进程要分开 ...

  6. ZeroMQ实例-使用ZeroMQ进行windows与linux之间的通信

    1.本文包括 1)在windows下使用ZMQ 2)在windows环境下与Linux环境下进行网络通信 2.在Linux下使用ZMQ 之前写过一篇如何在Linux环境下使用ZMQ的文章 <Ze ...

  7. linux c socket通信

    // // file_server.c  文件传输顺序服务器示例 // //本文件是服务器的代码 #include <netinet/in.h>    // for sockaddr_in ...

  8. linux进程socket通信,linux进程间通信--socket套接字 实例代码

    可以实现通信的代码实现,拿去用! 原文来自:http://blog.chinaunix.net/uid-26790551-id-3171897.html 服务器端: #include #include ...

  9. Linux下socket通信和epoll

    上一篇博客用多线程实现服务端和多个客户端的通信,但是在实际应用中如果服务端有高并发的需求,多线程并不是一个好选择. 实现高并发的一种方法是IO多路复用,也就是select,poll,epoll等等. ...

最新文章

  1. 嵌入式学习笔记-记录系统启动次数
  2. python学习手册条件-Python学习手册之控制结构(一)
  3. 在Linux下常用的命令
  4. 台式电脑计算机硬盘清理,台式电脑重装系统win7清理磁盘碎片的方法
  5. 看完就能独自把集群搭起来!Hadoop HDFS完全分布式环境搭建以及技术详解
  6. 黑苹果oc和clover哪个好?优势介绍 OpenCore Configurator for Mac中文版v2.16.1.0
  7. Ankhsvn 改名出错
  8. 软考—软件设计师(中级)第5版
  9. 统计学和计算机的关系,浅议统计学与其他学科的关系
  10. MPS柔性生产线加工实训系统QY-JDYT34
  11. 峨眉山徒步休闲三日游攻略内附详细时间
  12. vs解决方案和项目工程
  13. 快速查询多个圆通快递未签收单号的走件信息
  14. 少儿编程网站源码和scratch课程
  15. SSS1630规格书|SSS1630中文设计方案|USB音频解码方案
  16. Robot semantic description not found.
  17. 大数据关键技术、及计算模式介绍,以及大数据与云计算、物联网的关系
  18. matlab_矩阵和数组
  19. 彻底防止Windows 7/8/8.1升级更新到Windows 10
  20. python pad_python中的np.pad

热门文章

  1. Flume-ng HDFS sink原理解析
  2. java学习5-jar包的下载以及导入
  3. 写给自己,梳理一下我现在对前端知识结构的理解
  4. Unity3D动画面板编辑器状态属性对照表
  5. [MySQL FAQ]系列 -- 新年新思想:MySQL也能并发导入数据
  6. 语言基础(9):static, extern 和 inline
  7. 牛客网刷题知识汇总2
  8. SqlServer数据组织结构
  9. [阅读记录]《新ABS_Guide_cn.txt》shell脚本的编写
  10. Android APK 签名比对