error:创建到服务器(9903) 的连接失败

error:创建到服务器(9903) 的连接失败,第1张

游戏服务器注意事项

一、硬件的安装

1、保证服务器风扇正常转动。

2、保证服务器各个提示灯是否正常。

3、开机察看服务器有无报警情况。

4、开机察看服务器能否正常启动(不插鼠标键盘的情况下)

二、系统的安装

安装RHEL 4.1

选择自动分区。

分别给2块网卡配置ip,方便以后配置,其中eth0配内网ip,eth1配外网ip。

不启用防火墙。

增加中文语言包。

选择软件包时,只选择开发包.

三、系统的简单设置

1、防火墙的简单设置:

vi /etc/rc.d/forward

内容:(例子)

#!/bin/bash

echo 1 >/proc/sys/net/ipv4/ip_forward

if [ -e /proc/sys/net/ipv4/tcp_ecn ]

then

echo 0 >/proc/sys/net/ipv4/tcp_ecn

fi

/sbin/iptables -F

/sbin/iptables -F -t nat

/sbin/depmod -a

/sbin/modprobe ip_tables

/sbin/modprobe ip_conntrack

/sbin/modprobe ip_nat_ftp

/sbin/modprobe ip_conntrack_ftp

/sbin/iptables -A INPUT -i lo -j ACCEPT

/sbin/iptables -A INPUT -i eth0 -j ACCEPT

/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#/sbin/iptables -A INPUT -i eth0 -p tcp -j REJECT --reject-with tcp-reset

/sbin/iptables -A INPUT -i eth0 -p udp -j REJECT --reject-with icmp-port-unreachable

#sshd

/sbin/iptables -A INPUT -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -s 218.80.198.250 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -s 210.22.188.21 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

#ftp server

#/sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

#game server

/sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 6020 -j ACCEPT

#db server

/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234 -d 203.110.165.30 -p tcp --dport 3306 -j DNAT --to 192.168.102.158:3306

/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234 -d 203.110.165.30 -p tcp --dport 3307 -j DNAT --to 192.168.102.159:3306

/sbin/iptables -P INPUT DROP

/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.102.0/24 -j MASQUERADE

保存后退出。

chmod 744 /etc/rc.d/forward

然后运行防火墙脚本,以后根据需求修改脚本。

再vi /etc/rc.d/only_forward

#!/bin/bash

echo 1 >/proc/sys/net/ipv4/ip_forward

if [ -e /proc/sys/net/ipv4/tcp_ecn ]

then

echo 0 >/proc/sys/net/ipv4/tcp_ecn

fi

/sbin/iptables -F

/sbin/iptables -F -t nat

/sbin/depmod -a

/sbin/modprobe ip_tables

/sbin/modprobe ip_conntrack

/sbin/modprobe ip_nat_ftp

/sbin/modprobe ip_conntrack_ftp

/sbin/iptables -A INPUT -i lo -j ACCEPT

/sbin/iptables -A INPUT -i eth0 -j ACCEPT

/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#/sbin/iptables -A INPUT -i eth0 -p tcp -j REJECT --reject-with tcp-reset

/sbin/iptables -A INPUT -i eth0 -p udp -j REJECT --reject-with icmp-port-unreachable

#sshd

/sbin/iptables -A INPUT -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -s 218.80.198.250 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

/sbin/iptables -A INPUT -s 210.22.188.21 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

#ftp server

#/sbin/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

#game server

/sbin/iptables -A INPUT -s 218.80.198.234 -p tcp -m state --state NEW -m tcp --dport 6020 -j ACCEPT

#db server

/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234 -d 203.110.165.30 -p tcp --dport 3306 -j DNAT --to 192.168.102.158

/sbin/iptables -t nat -A PREROUTING -s 218.80.198.234 -d 203.110.165.30 -p tcp --dport 3307 -j DNAT --to 192.168.102.159:3306

/sbin/iptables -P INPUT DROP

/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.102.0/24 -j MASQUERADE

此防火墙只允许公司的电脑可以登录游戏。

2、设置系统自动启动防火墙

vi /etc/rc.d/rc.local

增加一行

/etc/rc.d/forward

保存后退出

3、设置文件打开数

1) 修改/etc/security/limits.conf 增加2行:

* soft nofile 4096

* hard nofile 65535

2) 修改/etc/pam.d/login 增加1行

session required pam_limits.so

可用:

echo “* soft nofile 4096” >>/etc/security/limits.conf

echo “* hard nofile 65535” >>/etc/security/limits.conf

echo “session required pam_limits.so” >>/etc/pam.d/login

4、修改默认语言

vi /etc/sysconfig/i18n 修改

LANG="zh_CN.GB2312"

新建游戏运行用户ztgame,设置密码

useradd ztgame

passwd ztgame

用ztgame用户登录服务器,修改vi /home/ztgame/.bash_profile增加一行

ulimit –c unlimited

保存后退出。

四、游戏环境的搭建(按照4台网关服务器,5台场景服务器,1台数据库服务器的构架)

1、服务器IP设置

4台网关服务器配置外网ip和内网ip,5台场景服务器和数据库服务器只配置内网ip,并且服务器默认网关为第一台网关服务器的内网ip。

服务器以服务器应用-序号-机房序号命名(例GWServer01-CHJ01)。

修改/etc/hosts。

例子:

127.0.0.1 GWServer01-CHJ01 localhost.localdomain localhost

192.168.100.101 GWServer02-CHJ01

………

192.168.100.104 ScenServer01-CHJ01

………

192.168.100.109 DBServer-CHJ01

2、公钥的生成

在ztgame的用户下登陆第一台网关服务器,输入ssh-keygen -t dsa

接受 ~/.ssh/id_dsa 的默认位置。输入一个与你的帐号口令不同的口令句,再输入一次来确认。公钥被写入 ~/.ssh/id_dsa.pub。密钥被写入 ~/.ssh/id_dsa。

使用以下命令改变你的 .ssh 目录的许可权限:

chmod 755 ~/.ssh

把 ~/.ssh/id_dsa.pub用scp命令传到其它剩余9台服务器

scp~/.ssh/id_dsa.pub ztgame@192.168.102.108:~/.ssh/authorized_keys

在其它9台服务器下使用以下命令改变你的 authorized_keys 文件的许可权限:

chmod 755 ~/.ssh

chmod 644 ~/.ssh/authorized_keys

3、数据库服务器的安装

#首先确定你是root用户

#确定你有以下包

perl-DBD-MySQL-2.9004-3.1

perl-DBI-1.40-5

mysql-4.1.7-4.RHEL4.1

获得mysql-4.1.*.tar包,用tar –zxvf mysql-4.1.*tar解开压缩包,然后进入mysql-4.1.*目录

#根据体统类型选择编译方式

#i386体系结构的

CFLAGS="-O3 -mcpu=pentiumpro" CXX=gcc CXXFLAGS="-O3 -mcpu=pentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --with-raid --enable-thread-safe-client --enable-assembler --with-server-suffix =" for >>>MySQL Database of Zebra by Yhc<<<" --without-debug --with-extra-charsets=none --without-isam --disable-shared --with-mysqld-ldflags=-all-static --prefix=/usr/local/mysql --without-bench

#64位系统,x86_64

CFLAGS="-O3 -m64" CXX=gcc CXXFLAGS="-O3 -m64 -felide-constructors -fno-exceptions -fno-rtti" ./configure --with-raid --enable-thread-safe-client --enable-assembler --with-server-suffix =" for >>>MySQL Database of Zebra by Yhc<<<" --without-debug --with-extra-charsets=none --without-isam --disable-shared --with-mysqld-ldflags=-all-static --prefix=/usr/local/mysql --without-bench

#然后根据CPU数量进行编译

make -j 2 &&make install

#添加用户

groupadd mysql &&useradd -g mysql mysql

#创建目录

mkdir /usr/local/mysql/data &&mkdir /usr/local/mysql/run &&mkdir /usr/local/mysql/log &&mkdir /usr/local/mysql/var

#更改mysql目录所有者

chgrp mysql -R /usr/local/mysql &&chown mysql -R /usr/local/mysql

#增加打开文件数量

ulimit -n 4096

#添加PATH

echo "PATH=\"/usr/local/mysql/bin:\$PATH\"" >>/etc/profile &&export PATH="/usr/local/mysql/bin:$PATH"

#strip可执行文件

strip /usr/local/mysql/libexec/mysqld

#添加LIB PATH

echo "/usr/local/mysql/lib" >>/etc/ld.so.conf &&ldconfig

#将my.cnf文件cp到/etc目录下

cp support-files/my-huge.cnf /etc/my.cnf

#修改my.cnf

datadir=/db/mysql

#创建数据库存放路径

mkdir /db

chown mysql.mysql /db -R

#初始化Mysql表

su - mysql -c "mysql_install_db"

#启动服务器

su - mysql -c "mysqld_safe --skip-name-resolve --open-files-limit=4096&"

#创建数据库和用户

GRANT ALL PRIVILEGES ON *.* TO ztgame@192.168.104.% IDENTIFIED BY WITH GRANT OPTION

GRANT ALL PRIVILEGES ON *.* TO ztgame@localhost IDENTIFIED BY WITH GRANT OPTION

GRANT ALL PRIVILEGES ON *.* TO ztgame@218.80.198.234 IDENTIFIED BY WITH GRANT OPTION

4、数据库配置

用mysql进入,然后用create database dbname创建数据库。分别创建SuperServer、RecordServer、Bill数据库,然后用安装包目录下的*.sql的文件建立相应的表。(SessionServer.sql也导入到RecordServer库中)。

在SuperServer数据库SERVERLIST表内添加服务器配置信息。

例子:

INSERT INTO `SERVERLIST` VALUES (1,1,SuperServer,192.168.104.109,10000,192.168.104.109,10000)

INSERT INTO `SERVERLIST` VALUES(20,20,SessionServer,192.168.104.109,6000,192.168.104.109,6000)

INSERT INTO `SERVERLIST` VALUES(21,21,SceneServer,192.168.104.104,6010,192.168.104.104,6010)

INSERT INTO `SERVERLIST` VALUES(22,21,SceneServer,192.168.104.105,6011,192.168.104.105,6011)

INSERT INTO `SERVERLIST` VALUES(23,21,SceneServer,192.168.104.106,6012,192.168.104.106,6012)

INSERT INTO `SERVERLIST` VALUES(24,21,SceneServer,192.168.104.107,6013,192.168.104.107,6013)

INSERT INTO `SERVERLIST` VALUES(25,21,SceneServer,192.168.104.108,6014,192.168.104.108,6014)

INSERT INTO `SERVERLIST` VALUES(2200,22,GatewayServer,192.168.104.100,6020,210.51.23.132,6020)

INSERT INTO `SERVERLIST` VALUES(2201,22,GatewayServer,192.168.104.101,6020,210.51.23.133,6020)

INSERT INTO `SERVERLIST` VALUES(2202,22,GatewayServer,192.168.104.102,6020,210.51.23.134,6020)

INSERT INTO `SERVERLIST` VALUES(2203,22,GatewayServer,192.168.104.103,6020,210.51.23.135,6020)

INSERT INTO `SERVERLIST` VALUES(11,11,RecordServer,192.168.104.109,7010,192.168.104.109,7010)

INSERT INTO `SERVERLIST` VALUES(12,12,BillServer,192.168.104.109,7020,192.168.104.109,7020)

在RecordServer数据库上初始化某些表格,目前有ANSWER,TECH,COUNTRY,NPCDARE,ACCPRIV。

数据库服务器上跑SuperServer、SessionServer、RecordServer、BillServer四个服务,4个网关服务器分别跑4个网关服务,5个场景服务器分别跑5个场景服务。场景服务器对应的ID就是国家配置的ID号,这个ID号决定场景服务器上面跑几个国家。

五、服务端的配置和安装

1、获得安装包:

release-version.tar.bz2

map-version.tar.bz2

在/home/ztgame下建立以时间为名字的目录(game20050928),压缩包放入此目录,然后用tar –jxvf release-version.tar.bz2 和tar –jxvf map-version.tar.bz2解开压缩包

进入release目录,cp –rf ../map .

按照config.xml.example格式创建文件config.xml

配置文件主要定义了服务器的各种参数:

[global]这段主要定义了通用参数,如服务器本地网络设备名称,扩展网络设备名称,日志级别,SuperServer的服务器地址,端口等参数。

其他各个段定义了具体的服务参数,主要是指定该服务对应的数据库,数据库的连接地址,端口,用户名,密码等数据库连接字符串。每个服务可以定义日志文件的存放位置,如果没有指定,缺省放置在/tmp/目录下面。

如SuperServer服务

<SuperServer>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<mysql>mysql://test:123456@192.168.2.14:3306/SuperServer</mysql>

<logfilename>/home/test/tmp/superserver.log</logfilename>

</SuperServer>

上面配置指明SuperServer服务,采用连接串用户名test,密码123456,访问192.168.2.14服务器上3306端口下SuperServer数据库,日志文件存放在/home/test目录下。其他服务配置类似。

例子:

<?xml version="1.0" encoding="GB2312"?>

<!--所有各种服务器参数-->

<Zebra>

<global>

<!-- Specify the log level[debug,info,warning,error,fatal,always]. -->

<log>debug</log>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<!-- Use the specified local network device. -->

<ifname>eth0</ifname>

<!-- Connected to the specified supserserver, property port default value is 10000. -->

<superserver port="10000">192.168.104.109</superserver>

</global>

<SuperServer>

<!-- 统一用户平台登陆服务器列表文件 -->

<loginServerListFile>loginServerList.xml</loginServerListFile>

<!-- 角色名称唯一性验证服务器的地址 -->

<RoleregServer port="9901">218.80.198.252</RoleregServer>

<!-- 服务器信息采集的服务器地址 -->

<InfoServer port="9903">218.80.198.252</InfoServer>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<mysql>mysql://ztgame:yS29wahvCH@192.168.104.109:3306/SuperServer</mysql>

<!-- 如果要编码mysql连接字符串请使用工具,配置如下面的例子

<mysql encode="yes">lmOf.1kySwS0a09j11xyCdI1ySujl1hnCvT0hDitT0hjzv00gzSv00gDSw91tS9fE1

</mysql>-->

<logfilename>/log/superserver.log</logfilename>

</SuperServer>

<RecordServer>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<mysql>mysql://ztgame:yS29wahvCH@192.168.104.109:3306/RecordServer</mysql>

<logfilename>/log/recordserver.log</logfilename>

</RecordServer>

<BillServer>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<mysql>mysql://ztgame:yS29wahvCH@192.168.104.109:3306/Bill</mysql>

<logfilename>/log/billserver.log</logfilename>

</BillServer>

<BillClient>

<!-- 交易记录log文件路径 -->

<tradelogfilename>/log/clienttrade.log</tradelogfilename>

</BillClient>

<SessionServer>

<!--MySQL database connection[mysql://user:passwd@host:port/dbName]-->

<mysql>mysql://ztgame:yS29wahvCH@192.168.104.109:3306/RecordServer</mysql>

<logfilename>/log/sessionserver.log</logfilename>

<dare_active_time>3600</dare_active_time>

<offlineMsgPath>/log/offlineMessages</offlineMsgPath>

</SessionServer>

<ScenesServer>

<sceneinfofile>scenesinfo.xml</sceneinfofile>

<npctradefile>npctrade.xml</npctradefile>

<messageSystemFile>messageSystem.xml</messageSystemFile>

<charinitinfoFile>initcharinfo.xml</charinitinfoFile>

<magicrangeFile>magicrangefile.xml</magicrangeFile>

<questdir>quest/</questdir>

<mapdir>map/</mapdir>

<tbldir>map/</tbldir>

<gm_logfile>/log/gm_log.log</gm_logfile>

<!--回写档案平率(单位是秒) -->

<writebacktimer>300</writebacktimer>

<ossdir>/log/</ossdir>

<logfilename>/log/scenesserver.log</logfilename>

</ScenesServer>

<GatewayServer>

<!-- 国家排序方式 0:不排序 , 1:在线人数排序 , 2:注册人数排序 -->

<countryorder>2</countryorder>

<logfilename>/log/gatewayserver.log</logfilename>

<sceneinfofile>scenesinfo.xml</sceneinfofile>

<rolereg_verify>1</rolereg_verify>

<forbidWordsFile>forbidWords</forbidWordsFile>

</GatewayServer>

</Zebra>

注意存放日至的目录是否建立,以及建立session服务所要求的日志存放子目录offlineMessages。

修改loginServerList.xml,填入平台中心的FLServer服务器ip以及端口。

例子:

<?xml version="1.0" encoding="GB2312"?>

<LoginServerList>

<server ip="218.80.198.252" port="7001"/>

<server ip="210.22.188.20" port="7001"/>

</LoginServerList>

然后将修改好的版本传至其它9台服务器。并启动服务

六、服务器的启动,停止和更新

1、将运行脚本传至各个服务器。

2、开启游戏服务

通过ssh使用ztgame用户远程连接至第一台网关服务器,再通过网关服务器连接其他9台服务器,

10个窗口内分别进入最新的服务端存放目录/home/ztgame/game200508**/release/

数据库服务器 启动服务./SuperServer -d 和 ./SessionServer -d 和 ./RecordServer -d 和 ./BillServer -d

场景服务器 启动服务./ScenesServer -d

网关服务器 启动服务./GatewayServer -d

以上操作可以通过/home/ztgame/tools/allstart game200508**来启动(由于程序是后台运行,所以如发现程序运行时间过长,可以CTRL+c中断,并不影响程序的正常运行。)

3、停止游戏服务

通过ssh使用ztgame用户远程连接至第一台网关服务器,运行/home/ztgame/tools/allstop,中止所有服务

,此脚本是并不是强行杀进程,所以如果发现进程无法kill的情况,用/home/ztgame/tools/allstop_9来强行杀死进程。

4、查看游戏服务

通过ssh使用ztgame用户远程连接至第一台网关服务器,运行/home/ztgame/tools/allview,查看所有服务运行状态。

5、更新游戏服务

通过ssh使用ztgame用户远程连接至第一台网关服务器,再通过服务器连接其他9台服务器,

分别在/home/ztgame目录下面建立最新的服务端存放目录game200508**.

然后将服务器端安装包通过scp传到第一台网关服务器,在game200508**下解压。

tar jxvf zebra-release-*****

tar jxvf zebra-release-*****

cp map release/ -rf

然后从上一个版本里拷贝出一些配置文件覆盖源文件

cp /home/ztgame/game_old/release/config.xml /home/ztgame/game_new/release/

cp /home/ztgame/game_old/release/loginServerList.xml /home/ztgame/game_new/release/

cp /home/ztgame/game_old/release/messageSystem.xml /home/ztgame/game_new/release/

以上工作准备好后就可以将网关服务器上的版本传到其他服务器

scp -r /home/ztgame/game_new/* ztgame@192.168.100.111:/home/ztgame/game_new

以上操作可以通过shell脚本来实现

/home/ztgame/tools/installPackage game_new game-old

七、服务器数据的备份

1、数据备份

为了防止意外情况的发生造成数据的丢失,关键数据或整个系统或对有选择的系统部分,在本地和异地进行定时备份,以保证系统全部或部分在灾害出现时也能持续运行。

2、具体方案

1)、数据库每日备份

每天4:00,将RecordServer数据库拷贝至/root/back后进行压缩,然后上传至192.168.1.9服务器上,/root/back留有压缩版本。

运行脚本/root/scripts/back.sh

例子:

#!/bin/bash

rm /root/back/RecordServer/* -rf

/usr/local/mysql/bin/mysqlhotcopy RecordServer /root/back/RecordServer -u ztgame -p yS29wahvCH

sleep 5

cd /root/back

tar zcf `hostname`-RecordServer`date +%Y%m%d`.tar.gz RecordServer

sleep 5

echo "tar ok!"

/usr/local/bin/ncftpput -u gamebak -p gamebak@ztgame 218.80.198.234 / /root/back/`hostname`-RecordServer`date +%Y%m%d`.tar.gz

sleep 20

echo "upload RecordServer ok!"

2)、数据库即时备份

每隔1小时,将RecordServer数据库拷贝至/root/back/hour目录进行备份,然后将压缩文件传给特定服务器。

例子:

#!/bin/bash

hottime=`date +%Y%m%d%H%M`

mkdir /root/back/hour/RecordServer"$hottime"

/usr/local/mysql/bin/mysqlhotcopy RecordServer /root/back/hour/RecordServer"$hottime" -u ztgame -p yS29wahvCH

sleep 5

cd /root/back/hour

tar zcf `hostname`-RecordServer"$hottime".tar.gz RecordServer"$hottime"

sleep 5

echo "tar ok!"

/usr/local/bin/ncftpput -u backupdb -p backupdb 192.168.102.119 / /root/back/hour/`hostname`-RecordServer"$hottime".tar.gz

sleep 20

echo "upload RecordServer ok!"

rm `hostname`-RecordServer"$hottime".tar.gz -f

3)、日志备份

每天02:00,将/log/下前一天的日志,进行压缩,然后上传至192.168.1.9服务器。

运行脚本/root/scripts//upload_daily

例子:

#!/bin/bash

cd /log/

mkdir log`date --date 1 days ago +%Y%m%d`

mv *.log.`date --date 1 days ago +%y%m%d`-* log`date --date 1 days ago +%Y%m%d`

sleep 10

tar zcvf `hostname`-log`date --date 1 days ago +%Y%m%d`.tar.gz log`date --date 1 days ago +%Y%m%d`

/usr/local/bin/ncftpput -u log -p log@ztgame 218.80.198.234 / /log/`hostname`-log`date --date 1 days ago +%Y%m%d`.tar.gz

rm `hostname`-log`date --date 1 days ago +%Y%m%d`.tar.gz

注:计划任务通过/etc/crontab –e来进行设置

4)、即时日志备份

直接运行/home/ztgame/tools/upload 将最新日志上传至192.168.1.9服务器,方便研发部门查看。

运行脚本/home/ztgame/tools/upload,(

1.closesocket(一般不会立即关闭,并经历TIME_WAIT的过程)后想继续重用套接字:

和BOOL bReuseaddr = TRUE

使用setsockopt(s,SOL_SOCKET,SO_REUSEADDR (为const char *)&bReuseaddr大小(BOOL))

2。已经在强行关闭的连接状态SOKET的调用closesocket关闭没有经历过

TIME_WAIT:

BOOL bDontLinger = FALSE

使用setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(为const char *)&bDontLinger中,sizeof(BOOL))

的send(),recv()的过程中,有时由于网络条件等原因,不能指望发送和接收,设置发送和接收时间限制:

诠释nNetTimeout = 1000 / /秒

/ /发送时间限制

使用setsockopt(插座,SOL_S0CKET,SO_SNDTIMEO(char *)的nNetTimeout,是sizeof(int))

/ /接收时间限制使用setsockopt(插座,SOL_S0CKET SO_RCVTIMEO,(CHAR *)nNetTimeout,是sizeof(int))

发送()返回实际发送的字节(同步)或发送到socket缓冲区的字节/ (异步)默认状态下,系统发送和接收8688个字节(约8.5K),实际发送数据的过程中

大于套接字缓冲区中的数据可以设置,以避免在send(),RECV ()不断的循环收发器:

/ /接收缓冲区

诠释nRecvBuf = 32 * 1024 / /设置32K

使用setsockopt(s,SOL_SOCKET,SO_RCVBUF,(为const char * )nRecvBuf,是sizeof(int))

/ /发送缓冲地带

诠释nSendBuf = 32 * 1024 / / 32K

使用setsockopt(,SOL_SOCKET在SO_SNDBUF,(为const char *) nSendBuf,是sizeof(int))

发送数据时,他们不希望体验到的系统缓冲区的套接字缓冲区拷贝

程序影响性能:

诠释nZero = 0 BR />使用setsockopt(插座,SOL_S0CKET SO_SNDBUF,(CHAR *)nZero sizeof(nZero)的)

同上。在recv()以上(默认情况下的套接字缓冲区的内容复制到系统缓冲区):

诠释nZero = 0

setsockopt函数(SO_RCVBUF套接字SOL_S0CKET,(字符*)nZero如sizeof(int))

一般发送UDP数据包,希望套接字发送数据广播的特点:

BOOL bBroadcast = TRUE

使用setsockopt(SOL_SOCKET,SO_BROADCAST,(S,为const char *)&bBroadcast中,sizeof(BOOL))

8客户端连接到服务器的过程中,如果你是非阻塞模式的socket在connect()

过程中设置连接()延时,直到accpet()被调用(此功能只有在这个过程中的非阻塞

作用显着的作用,在阻塞的函数调用)

BOOL bConditionalAccept = TRUE

使用setsockopt(s,SOL_SOCKET中,SO_CONDITIONAL_ACCEPT,(为const char *)&bConditionalAccept中,sizeof(BOOL))

在这个过程中,将数据发送(send()方法还没有完成,还没有数据发送)则closesocket()之前,我们

一般采取的措施是“小康”关机(S,SD_BOTH),但肯定是丢失的数据,如何设置程序中的具体应用,以满足<BR / (即没有完成数据发送后关闭套接字)?

结构萦绕{

u_short l_onoff

u_short l_linger

萦绕m_sLinger

m_sLinger.l_onoff = 1 / /(在closesocket关闭()调用,但呆在那里时,数据不会被发送后)

/ /。 ,如果m_sLinger.l_onoff = 0,功能和2)的作用是相同的

m_sLinger.l_linger = 5 / /(允许停留五秒钟)

的setsockopt函数(,,SOL_SOCKET, SO_LINGER,(为const char *)&m_sLinger中,sizeof(流连忘返))


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/468555.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-05
下一篇2023-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存