WINDOW与LINUX的TCP/IP通信
来源:互联网 发布:霍华德站立摸高数据 编辑:程序博客网 时间:2024/06/04 19:29
客户端与服务器端通信流程
客户端Linux 建立socket 确定服务器scokaddr_in结构体 点分十进制IP转换 使用connect连接 打开文件 准备缓冲区 缓冲区初始化置空 将文件内容读入缓冲区 使用send将缓冲区内容发送到服务器 文件内容发送完成 关闭文件 关闭socket服务器 Windows 添加winsock头文件 初始化WSAStartup 建立socket 确定服务器scokaddr_in结构体 点分十进制IP转换 使用bind绑定套接字 使用listen监听 使用accept接受连接请求 accept返回新的套接字描述符 使用recv接收传来的数据(文件路径) 打开文件,这里需要文件名 从该字符串获取文件名 使用recv接收文件内容 判断recv函数返回的状态 将接收到的内容放入缓冲区 将缓冲区内容写入文件 关闭文件 WSACleanup函数 关闭socket
WINDOW下socket编程和LINUX的区别
头文件 #include <winsock2.h>初始化 windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。linux下不需要使用Socket的程序在使用Socket之前必须调用WSAStartup函数。 int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ); 1)wVersionRequested是Windows Sockets API提供的调用方可使用的最高版本号。 2)lpWSAData 是指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。 当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。假如一个程序要使用2.1版本的Socket,那么程序代码如下 wVersionRequested = MAKEWORD( 2, 1 ); WSACleanup函数 int WSACleanup (void); 应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统关闭socket windows下closesocket(...) linux下close(.…获取错误码 windows下getlasterror()/WSAGetLastError() linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量
LINUX和WINDOWS下sockaddr_in结构体的区别
Linux: struct sockaddr_in { u_short sin_family;//2B u_short sin_port;//2B struct in_addr sin_addr;//4B char sin_zero[8];//8B } Windows: struct SOCKADDR_IN {short int sin_family; //2B unsigned short int sin_port; //2B端口(使用网络字节顺序)struct IN_ADDR sin_addr; //4B IP地址,是个结构unsigned char sin_zero[8]; //8B };
其他的一些小细节
在Windows中 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)在Linux中 connect(sockcd,(struct sockaddr*)&server,sizeof(server))在C和C++中文件的创建函数是不一样的,不要弄错了Windows和Linux中的sleep函数 Windows中Sleep函数S大写,Linux中sleep函数s小写 Windows中头文件是#include <windows.h> Linux中头文件是#include <unistd.h>Linux中将IP地址赋值给IP地址结构体 if(inet_pton(AF_INET,"192.168.0.13",&server.sin_addr)<0) { printf("inet_pton error!\n"); }Windows中赋值 server.sin_addr.s_addr= inet_addr("192.168.0.13");
WINDOWS作为服务器端的代码
#include <winsock2.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#pragma comment(lib, "WS2_32.lib") //add ws2_32.lib#define MAXLINE 4096#define BUFFER_SIZE 1024int main(){ WORD wVersionRequested; WSADATA wsaData; int err,iLen; SOCKET sockSrv; wVersionRequested = MAKEWORD(2,2); char filename[100]; char filepath[100]; char *buffer;//file buffer int fileTrans; int lenfilepath; FILE *fp; int writelength; buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE); //bzero(buffer,BUFFER_SIZE); memset(buffer,0,sizeof(buffer)); if(WSAStartup(wVersionRequested,&wsaData)!=0) { printf("WSAStartup error!\n"); return -1; } if(( sockSrv =socket(AF_INET,SOCK_STREAM,0))<0){ printf("socket error!\n"); return -2; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_addr.s_addr = htonl(INADDR_ANY); addrSrv.sin_port = htons(9000); if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0) { printf("bind error!\n"); return -3; } if(listen(sockSrv,5)!=0) { printf("listen error!\n"); return -4; } printf("Sever build finished ...\n"); while(1) { SOCKET temp; if((temp = accept(sockSrv,(SOCKADDR*)NULL,NULL))>0) { //printf("client IP: %d\n",ntohl(client.sin_addr.s_addr)); //printf("client PORT: %d\n",ntohs(client.sin_port)); memset(filename,'\0',sizeof(filename)); memset(filepath,'\0',sizeof(filepath)); lenfilepath = recv(temp,filepath,100,0); printf("filepath :%s\n",filepath); if(lenfilepath<0) { printf("recv error!\n"); } else { int i=0,k=0; for(i=strlen(filepath);i>=0;i--) { if(filepath[i]!='/') { k++; } else break; } strcpy(filename,filepath+(strlen(filepath)-k)+1); } printf("filename :%s\n",filename); fp = fopen(filename,"w"); if(fp!=NULL) { while(fileTrans =recv(temp,buffer,BUFFER_SIZE,0)) { if(fileTrans<0) { printf("recv error!\n"); break; } writelength = fwrite(buffer,sizeof(char),fileTrans,fp); if(writelength <fileTrans) { printf("write error!\n"); break; } //bzero(buffer,BUFFER_SIZE); memset(buffer,'\0',sizeof(buffer)); } printf("recv finished!\n"); fclose(fp); } else { printf("filename is null!\n"); } closesocket(temp); } else { printf("accept error!\n"); closesocket(temp); } } closesocket(sockSrv); WSACleanup(); return 0;}
LINUX作为客户端的代码
#include <stdio.h>#include <sys/socket.h>#include <sys/types.h>#include <string.h>#include <netinet/in.h>#include <errno.h>#include <memory.h> #include <stdlib.h> //for malloc#define BUFFER_SIZE 1024int main(){ int sockcd; struct sockaddr_in server; char filepath[100];//file to translate FILE *fp; int lenpath; //filepath length char *buffer;//file buffer int fileTrans; buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE); bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); if((sockcd = socket(AF_INET,SOCK_STREAM,0))<0) { printf("socket build error!\n"); } memset(&server,0,sizeof(server)); server.sin_family= AF_INET; server.sin_port = htons(9000); if(inet_pton(AF_INET,"192.168.0.13",&server.sin_addr)<0) { printf("inet_pton error!\n"); } if(connect(sockcd,(struct sockaddr*)&server,sizeof(server))<0) { printf("connect error!\n"); }//connect with server printf("file path:\n"); scanf("%s",filepath);//get filepath fp = fopen(filepath,"r");//opne file if(fp==NULL) { printf("filepath not found!\n"); return 0; } printf("filepath : %s\n",filepath); lenpath = send(sockcd,filepath,strlen(filepath),0);// put file path to sever if(lenpath<0) { printf("filepath send error!\n"); } else { printf("filepath send success!\n"); } sleep(3); while((fileTrans = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0) { printf("fileTrans =%d\n",fileTrans); if(send(sockcd,buffer,fileTrans,0)<0) { printf("send failed!\n"); break; } bzero(buffer,BUFFER_SIZE); //memset(buffer,0,sizeof(buffer)); } fclose(fp); close(sockcd); return 0;}
阅读全文
0 0
- WINDOW与LINUX的TCP/IP通信
- Linux环境下的TCP/IP通信
- linux 中socket的TCP/IP通信
- TCP/IP实现window和unix通信
- TCP/IP通信与UDP通信的区别
- Linux Socket TCP/IP通信
- Linux下TCP/IP通信
- Linux网络通信TCP/IP
- Linux 与Window之间的通信
- Linux操作系统下的TCP/IP网络通信
- 基于linux简单的TCP/IP网络通信代码
- linux与window socket通信
- 嵌入式Linux实现TCP/IP通信
- Linux网络通信 -- TCP/IP协议
- 使用TCP/IP与服务器进行通信
- TCP/IP协议与Socket通信
- TCP/IP协议与Socket通信
- java客户端与服务端通信Tcp/Ip
- ORA-09925: Unable to create audit trail file
- Linux基础——第一关
- VMware12版虚拟机怎么安装win7系统(详细教程)
- 记录:non-compatible bean definition of same name and class [com.XXX.XXX]
- Java通过python命令执行DataX任务
- WINDOW与LINUX的TCP/IP通信
- Git,GitHub入门
- laytpl--前端数据绑定
- Best Time to Buy and Sell Stock II(leetcode)
- URI和URL的区别
- Eclipse的菜单简介
- MySQL学习
- sql 学习心得 第一篇
- ruby环境搭建记录