博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]windows和linux进行socket通信
阅读量:5116 次
发布时间:2019-06-13

本文共 4106 字,大约阅读时间需要 13 分钟。

     在公司里面,我们平时使用的机器一般都是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 
#include
#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 
#include
#include
#include
#include
#include
#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代码是根据网友的代码修改而来,一并表示感谢。如有侵权,请邮件告知。   

转自:http://blog.csdn.net/feixiaoxing/article/details/8567162

转载于:https://www.cnblogs.com/taskiller/archive/2013/02/09/2909583.html

你可能感兴趣的文章
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>