面向无连接的通信实例

来源:互联网 发布:淘宝信誉度等级表 编辑:程序博客网 时间: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;}


 

 


 

 

 

 

原创粉丝点击