传递服务器(服务器通信)
C#客户端和服务器端传递信息
//这是服务器端
#include<stdio.h>
#include<winsock2.h>
#include<string.h>
#include<conio.h>
#pragma comment(lib,"Ws2_32.lib")
SOCKET server;
SOCKET client;
WSADATA WSAData;
int WSAreturn;
sockaddr_in local;
sockaddr_in from;
int fromlen= sizeof(from);
char information[50];
char welcome[]="欢迎您登陆YYJW主机!\n";
char receive[256];
char ip[]="您的IP是:";
char chat[256];
char c;
int i=0;
bool cansend=false;
int GetIp()
{
WSAreturn= WSAStartup(0x101,&WSAData);
if(WSAreturn)
{
printf("发生一个未知错误!\n");
return 0;
}
local.sin_family= AF_INET;
local.sin_addr.s_addr= INADDR_ANY;
local.sin_port= htons((u_short)23);
server= socket(AF_INET,SOCK_DGRAM,0);
if(server==INVALID_SOCKET)
{
printf("无法创建套接字!\n");
return 0;
}
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
printf("无法绑定套接字!\n");
return 0;
}
//if(listen(server,5)!=0)
//{
//printf("无法监听端口!\n");
//return 0;
//}
while(true)
{
printf("正在等待用户连接...\n");
//client= accept(server,(struct sockaddr*)&from,&fromlen);
strcpy(information,inet_ntoa(from.sin_addr));
strcat(welcome,information);
printf("接受来自%s的连接...\n",inet_ntoa(from.sin_addr));
printf("正在发送欢迎消息...\n");
send(client,welcome,strlen(welcome),0);
//send(client,ip,strlen(ip),0);
//send(client,information,strlen(information),0);
printf("欢迎消息信息已经成功发送至客户端!\n");
while(1)
{
if(!cansend)
{
printf("正在等待对方发来消息...\n");
cansend=false;
recv(client,receive,sizeof(receive),0);
printf("*********接受到的消息***********\n");
printf("%s\n",receive);
printf("**************结束**************\n");
cansend=true;
}
else
{
printf("请输入下一条消息:");
scanf("%s\0",&chat);
send(client,chat,strlen(chat),0);
printf("\n已经成功发送出信息!\n");
cansend=false;
}
}
closesocket(client);
}
closesocket(server);
WSACleanup();
return 1;
}
void main()
{
int ok;
ok= GetIp();
if(ok==0)
printf("无法完成请求!\n");
getch();
}
//这是客户端
#include<stdio.h>
#include<winsock2.h>
#include<string.h>
#include<conio.h>
#pragma comment(lib,"Ws2_32.lib")
SOCKET client;
WSADATA WSAData;
int WSAreturn;
sockaddr_in to;
char information[256];
char welcome[]="我已经登陆到你的主机!\n";
char receive[256];
char chatto[256];
char servername[256];
char chatfrom[256];
char c;
long result;
bool cansend=true;
int connection()
{
WSAreturn= WSAStartup(0x101,&WSAData);
if(WSAreturn)
{
printf("发生一个未知错误!\n");
return 0;
}
client= socket(AF_INET,SOCK_DGRAM,0);
to.sin_family= AF_INET;
to.sin_port= htons(23);
while(true)
{
printf("请输入要登陆的IP:");
scanf("%s",&servername);
to.sin_addr.s_addr= inet_addr(servername);
printf("正在连接...\n");
result= connect(client,(struct sockaddr*)&to,sizeof(to));
if(SOCKET_ERROR==result)
{
//连接失败
printf("对不起,无法连接到目标主机!\n");
WSACleanup();
return 0;
}
else
{
cansend=false;
recv(client,receive,sizeof(receive),0);
printf("*******欢迎消息消息*******\n");
printf("%s\n",receive);
printf("***********结束*********\n");
cansend=true;
while(1)
{
if(cansend)
{
printf("请输入下一条信息:");
scanf("%s\0",&chatto);
send(client,chatto,strlen(chatto),0);
printf("\n已经成功发送信息!\n");
cansend=false;
}
else
{
printf("正在等待对方发来消息...\n");
cansend=false;
recv(client,chatfrom,sizeof(chatfrom),0);
printf("*******接收到的消息*******\n");
printf("%s\n",chatfrom);
printf("***********结束*********\n");
cansend=true;
}
}
}
}
closesocket(client);
WSACleanup();
return 1;
}
void main()
{
connection();
getch();
}
如何使数据在客户机和服务器之间传递
我们还是从计算机的网络层说起,主要是分为7个层分别是物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
数据之间的交互主要在传输层这一块。通常用到的底层协议有TCP和UDP这两种协议。通过中间层SOCKET协议,进行包装,再往上就是我们经常用到的HTTP协议。我们的网站就是通过HTTP协议进行客户端和服务器数据交互的。
HTTP协议是面向连接的协议基于TCP。按照三次握手四次挥手的规则进行数据交互。其中底层有用到网络套接字的概念。通过网络套接字,可以知道相互通信的IP地址和端口,这样就像你打电话一样,知道对方的手机号才能打给指定的人。
上面这个就是我们网站的http协议请求,里面有请求头,请求体。按照标准的约定去给服务端发送请求数据,然后服务端响应结果给客户端。同时我们的实时聊天软件,比如今日头条的聊天软件就是通过TCP,SOCKET来进行通信的,这种是面向连接的长链接方式,双向通信。响应指定封包协议和解包协议,通过socket的处理,去监听两端的端口,分别获取各自的数据,和发送各自的数据。实现双向通信。具体过程如下:
>客户端步骤
1.创建套接字
2.向服务器发送连接请求(connect)
3.通信(send/recv)
4.关闭套接字
>服务器端步骤
1.创建用于监听的套接字(socket)
2.将套接字绑定到本地地址和端口上(bind)
3.将套接字设为监听模式(listen)
4.等待客户请求(accept),此处要不断的调用accept
5.通信(send/receive),完成后返回4
6.关闭套接字(closesocket)
谢谢阅读,欢迎在线咨询
如何配置 SMTP 虚拟服务器以进行邮件传递
如何配置 SMTP虚拟服务器以进行邮件传递,解答如下
配置重试次数和重试间隔
如果无法在第一次尝试时传递邮件,则 Microsoft简单邮件传输协议(SMTP)服务会在指定时间后再次从队列目录发送该邮件。可以设置传递尝试之间的时间间隔,还可以指定尝试传递邮件的次数。达到限制后,会将未送达报告(NDR)和邮件发送到 Badmail(死信)目录中。
可以使用这些设置提高服务器输出速度,但这些设置只影响传出邮件,对其他服务器处理传入邮件的速度不会有任何影响。要配置这些设置,请按照下列步骤操作:
在 Microsoft管理控制台(MMC)中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
单击传递选项卡。
在第一次重试间隔(分钟)中,键入在发布第一个通知之前尝试传递的时间值。默认值为 15分钟。
在第二次重试间隔(分钟)中,键入在发布第二个通知之前尝试传递的时间值。默认值为 30分钟,即第一次重试间隔后 30分钟。
在第三次重试间隔(分钟)中,键入在发布第三个通知之前尝试传递的时间值。默认值为 60分钟,即第二次重试间隔后 60分钟。
在后续重试间隔(分钟)中,键入在发布通知之前尝试传递的时间值。默认值为 240分钟。
设置邮件的跃点计数
传递邮件时,邮件在到达其最终目标之前可能被路由到多个服务器上。可以指定允许邮件通过的服务器数目。这称为跃点计数。要设置邮件的跃点计数,请按照下列步骤操作:
在 MMC中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
在传递选项卡上,单击高级以打开高级传递对话框。
在最大跃点计数中,键入邮件可以通过的源服务器和目标服务器之间的跃点的数值。默认值为 15个跃点。
注意:设置跃点计数后,SMTP服务器将计算邮件头的已接收字段中列出的跃点。如果已接收字段中的数目超出最大跃点计数设置,邮件就会返回给发件人,并随附一个 NDR。
设置虚拟域
虚拟域可替换协议中任何发件人行中使用的任意本地域名称。此种替换仅发生在第一个跃点上。
在 MMC中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
在传递选项卡上,单击高级以打开高级传递对话框。
在虚拟域中,键入您希望在邮件头中显示的域名,而不是域的真实名称。
注意:对此类邮件的所有答复都是通过使用虚拟域的 SMTP虚拟服务器进行路由的。
设置完全限定域名
启动时,在系统属性对话框的网络标识选项卡上指定的名称将自动作为完全限定域名(FQDN)。如果更改此名称(手动或通过加入 Microsoft Windows 2000域),则在下次重新启动计算机后,新名称将自动用作 FQDN。您不必执行任何操作即可更新虚拟服务器的 FQDN。
要重写网络标识选项卡上自动使用的计算机名和域名,请在高级传递对话框(通过传递选项卡可找到此对话框)中更改 FQDN。这样,Microsoft SMTP服务将使用指定的名称,而不使用在网络标识选项卡上指定的名称。要设置 FQDN,请按照下列步骤操作:
在 MMC中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
在传递选项卡上,单击高级以打开高级传递对话框。
在完全限定的域名中,键入 FQDN。
配置智能主机
可以通过智能主机路由所有要发送到远程域中的传出邮件,而不是将这些邮件直接发送到域。这允许您通过比其他路由更直接或更经济的连接来路由邮件。智能主机类似于远程域的路由域选项。区别是指定智能主机后,所有传出邮件都将路由到该服务器。而使用路由域,则只有发往远程域的邮件路由到特定服务器。
如果设置了智能主机,则仍可以为远程域指定其他路由。路由域设置将重写智能主机设置。要设置智能主机,请按照下列步骤操作:
在 MMC中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
在传递选项卡上,单击高级以打开高级传递对话框。
在智能主机中,键入智能主机服务器的名称。可以键入一个字符串来表示名称,也可以键入 IP地址。
如果想让 Microsoft SMTP服务在将远程邮件转发给智能主机服务器之前尝试直接传递这些远程邮件,请单击以选中发送到智能主机之前尝试直接进行传递复选框。默认情况下,会向智能主机发送所有远程邮件,而不尝试直接进行传递。
注意:可以通过 FQDN或 IP地址来标识智能主机。请注意,如果更改 IP地址,则还必须在每台虚拟服务器上分别进行更改。如果使用的是 IP地址,请将其括在方括号([])中以提高系统性能。Microsoft SMTP服务首先检查服务器名称,然后检查 IP地址。括号将值标识为 IP地址,因此会跳过 DNS查找。
启用反向 DNS查找
如果选择了此选项,Microsoft SMTP服务将尝试验证客户端的 IP地址是否与客户端用 EHLO或 HELO命令提交的主机或域相匹配。
注意:因为此功能可验证所有传入邮件的地址,所以使用它会影响 Microsoft SMTP服务性能。清除该复选框可禁用此功能。
如果反向 DNS查找成功,“已接收”邮件头将保持完好无损。如果验证不成功,则“已接收”邮件头中的 IP地址后面会出现“未验证”。要启用反向 DNS查找,请按照下列步骤操作:
在 MMC中,单击以选中 SMTP虚拟服务器,然后在操作菜单上,单击属性。
在传递选项卡上,单击高级以打开高级传递对话框。
单击以选中对传入邮件执行反向 DNS查找复选框。