面向无连接的通信实例
来源:互联网 发布:淘宝信誉度等级表 编辑:程序博客网 时间:2024/05/21 21:44
面向无连接的通信实例
无连接服务器一般都是面向事务处理的,一个请求与一个应答就完成了客户程序与服务程序之间的相互作用。
无连接通信的特点:
1.服务器必须先启动;
2.客户端不需调用connect(),服务器端不需要调用listen();
3.服务器端和客户端的socket只需设定好通信端口号和服务器的IP地址;
下面是一个面向无连接的Socket通信实例,客户端向服务器一条要打开的文件信息,服务器响应客户端输入的信息,并将打开文件的内容返回给客户端。如服务器启动后,客户端让服务器端打开服务器的C:\test.txt,服务器打开该文件后,再将文件中的内容发回给客户端。
一、服务器端程序
#include "stdafx.h"#include <stdio.h>#include <Winsock2.h>#include <stdlib.h>#define SERVICEPORT 10001#define RECV_BUFFER_SIZE 160 //定义接收字符串的大小#define SEND_BUFFER_SIZE 16384 //定义返回字符串的大小#include <ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")int main(){SOCKET ServerSocket;sockaddr_in ServerSockAddr;sockaddr_in ClientSockAddr;socklen_t ClientSockAddrLength =sizeof(ClientSockAddr);char RecvBuffer[RECV_BUFFER_SIZE];char SendBuffer[SEND_BUFFER_SIZE];char CommandLine[RECV_BUFFER_SIZE];FILE * ftmp;WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");return 0;}//启动 Windows SocketServerSocket = socket(PF_INET,SOCK_DGRAM,0);if (ServerSocket == -1){printf("Socket create error.\n");return -1;}ServerSockAddr.sin_family = AF_INET;ServerSockAddr.sin_port = htons(SERVICEPORT);ServerSockAddr.sin_addr.s_addr = INADDR_ANY;//ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");//服务器端的IP地址和端口号设定完毕int b_bind = bind(ServerSocket,(sockaddr*)(&ServerSockAddr), sizeof(ServerSockAddr));//将服务器的Socket与服务器的IP地址绑定在一起if (b_bind == -1){printf("Binding error.\n");return -1;}elseprintf("Server is running.\n");/**/int RecvLength;int ReadLength;//下面注释行是将服务器端的窗口隐藏/*HWND hwnd;hwnd = ::FindWindow(_T("ConsoleWindowClass"),NULL);if (hwnd){ShowOwnedPopups(hwnd,SW_HIDE);ShowWindow(hwnd,SW_HIDE);}*/while(true){memset(RecvBuffer,0,sizeof(RecvBuffer));RecvLength = recvfrom( ServerSocket, RecvBuffer, RECV_BUFFER_SIZE, 0, (sockaddr*)&ClientSockAddr, &ClientSockAddrLength);/*注意,recvfrom函数中需要设定的参数是: A:与服务端绑定的SOCKET; B:用来接收信息的缓存区大小; 通过引用可以得到的有: A:发送消息的客户端IP地址: B:客户端IP地址大小;*/if (RecvLength > 0){printf("user's request is :%s\n",RecvBuffer);strcpy(CommandLine,RecvBuffer);WinExec(RecvBuffer,SW_SHOW);//执行.exe文件printf("open the file: %s",CommandLine); ftmp = fopen(CommandLine,"r"); if (ftmp == NULL){printf("Open file error!\n");continue;}memset(SendBuffer,0,SEND_BUFFER_SIZE);ReadLength = fread(SendBuffer,1,SEND_BUFFER_SIZE,ftmp);if (ReadLength <= 0){printf("Open temple file error!\n");strcpy(SendBuffer,"No output.\n");}fclose(ftmp);sendto(ServerSocket,SendBuffer, strlen(SendBuffer),0,(sockaddr*)&ClientSockAddr,ClientSockAddrLength); //sendto中第一参数只需要指定其SOCKET的报文类型,发送的报文信息,及目的端的//IP地址信息等;}}closesocket(ServerSocket);WSAClenup();return 0;}
二、客户端程序
#include "stdafx.h"#include <stdio.h>#include <Winsock2.h>#include <stdlib.h>#include <ws2tcpip.h>#define SERVICEPORT 10001#define RECV_BUFFER_SIZE 16384#define SEND_BUFFER_SIZE 16384#pragma comment(lib,"ws2_32.lib")int main(){SOCKET ClientSocket;sockaddr_in ServerSockAddr;socklen_t ServerSockAddrLength =sizeof(ServerSockAddr);char RecvBuffer[RECV_BUFFER_SIZE];char SendBuffer[SEND_BUFFER_SIZE];char CommandLine[SEND_BUFFER_SIZE];WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");//return;} ClientSocket = socket(AF_INET,SOCK_DGRAM,0);if (ClientSocket == -1){printf("Socket create error.\n");return -1;} memset(&ServerSockAddr,0,ServerSockAddrLength);ServerSockAddr.sin_family = AF_INET;ServerSockAddr.sin_port = htons(SERVICEPORT);//ServerSockAddr.sin_addr.s_addr = inet_addr("192.168.0.80");ServerSockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //此时客户端只是定义了SOCKET的类型, //而服务器端的socketadd_in 包含类型、端口号、以及详细IP地址int RecvLength;int CommandLength;while(true){printf("Please input the code to server:\n");memset(CommandLine,0,SEND_BUFFER_SIZE);gets(CommandLine);if (strcmp(CommandLine,"exit")==0){break;}CommandLength = strlen(CommandLine);if (CommandLength <=0)continue;memset(SendBuffer,0,SEND_BUFFER_SIZE);memcpy(SendBuffer,CommandLine,strlen(CommandLine));sendto(ClientSocket, SendBuffer, strlen(SendBuffer), 0, (sockaddr*)(&ServerSockAddr), ServerSockAddrLength); //向具体的IP服务器端发送报文信息 memset(RecvBuffer,0,RECV_BUFFER_SIZE);RecvLength = recvfrom( ClientSocket, RecvBuffer, RECV_BUFFER_SIZE, 0, (sockaddr*)&ServerSockAddr, &ServerSockAddrLength ); //从指定的IP服务器端收报文int i = WSAGetLastError();if (RecvLength > 0){printf("The server has responsed.\n");printf("%s\n",RecvBuffer);}}closesocket(ClientSocket);return 0;}
- 面向无连接的通信实例
- 面向连接的通信和无连接的通信
- 面向连接的通信和无连接的通信
- Linux socket之三:面向无连接的socket通信&&sokcet超时处理
- Linux socket之三:面向无连接的socket通信&&sokcet超时处理
- 面向连接和无连接的服务
- 面向连接和无连接的区别
- 面向连接与无连接的区别!
- 面向连接和无连接的正确理解:
- 面向连接 无连接
- 【Linux基础】面向连接的套接字通信(TCP)之使用实例
- UDP(面向无连接)的socket编程
- 利用WinSock进行无连接的通信
- UDP无连接的Socket通信
- UNIX domain中面向连接通信实现实例
- 面向连接的套接字通信
- Linux下 面向连接的 UDP通信
- Linux - 面向连接的socket通信流程
- 我的博客旅行之Android环境搭建
- 判断三角形
- C#简单的面试题目(四)
- 大整数加法
- PHP5.4上传进度支持(Upload progress in sessions)
- 面向无连接的通信实例
- 十进制、八进制、十六进制格式转换
- 扩展ASP.NET MVC三层框架并使用StructureMap实现依赖注入1
- mac os 设置环境变量
- _javaScript_Html笔记二
- 二叉查找树转为双向链表
- 宏定义以及调试相关
- Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)
- SQL server中数据库中几种数据类型的区别