有了解网游引擎socket serversocket的吗,想请教几个问题

linux下socket通信,server和client简单例子 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 18时,
linux socket 来自网络收集
代码片段(3)
1.&[代码]c代码 server部分&&&&
====================================================================
#include &netinet/in.h&
// for sockaddr_in
#include &sys/types.h&
// for socket
#include &sys/socket.h&
// for socket
#include &stdio.h&
// for printf
#include &stdlib.h&
// for exit
#include &string.h&
// for bzero
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &unistd.h&
#define HELLO_WORLD_SERVER_PORT
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(PF_INET,SOCK_STREAM,0);
if( server_socket & 0)
printf("Create Socket Failed!");
int opt =1;
setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
//把socket和socket地址结构联系起来
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
//server_socket用于监听
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
printf("Server Listen Failed!");
while (1) //服务器端要一直运行
//定义客户端的socket地址结构client_addr
struct sockaddr_in client_
socklen_t length = sizeof(client_addr);
//接受一个到server_socket代表的socket的一个连接
//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
//new_server_socket代表了服务器和客户端之间的一个通信通道
//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket & 0)
printf("Server Accept Failed!\n");
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
if (length & 0)
printf("Server Recieve Data Failed!\n");
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)&FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
int fp = open(file_name, O_RDONLY);
if( fp & 0 )
printf("%s\n",file_name);
FILE * fp = fopen(file_name,"r");
if(NULL == fp )
printf("File:\t%s Not Found\n", file_name);
bzero(buffer, BUFFER_SIZE);
int file_block_length = 0;
while( (file_block_length = read(fp,buffer,BUFFER_SIZE))&0)
while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))&0)
printf("file_block_length = %d\n",file_block_length);
//发送buffer中的字符串到new_server_socket,实际是给客户端
if(send(new_server_socket,buffer,file_block_length,0)&0)
printf("Send File:\t%s Failed\n", file_name);
bzero(buffer, BUFFER_SIZE);
close(fp);
fclose(fp);
printf("File:\t%s Transfer Finished\n",file_name);
//关闭与客户端的连接
close(new_server_socket);
//关闭监听用的socket
close(server_socket);
2.&[代码]c代码 client部分&&&&
#include &netinet/in.h&
// for sockaddr_in
#include &sys/types.h&
// for socket
#include &sys/socket.h&
// for socket
#include &stdio.h&
// for printf
#include &stdlib.h&
// for exit
#include &string.h&
// for bzero
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&
#include &unistd.h&
#define HELLO_WORLD_SERVER_PORT
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
if (argc != 2)
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
//设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_
bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0
client_addr.sin_family = AF_INET;
//internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(0);
//0表示让系统自动分配一个空闲端口
//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket & 0)
printf("Create Socket Failed!\n");
//把客户机的socket和客户机的socket地址结构联系起来
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
printf("Client Bind Port Failed!\n");
//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
struct sockaddr_in server_
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数
printf("Server IP Address Error!\n");
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) & 0)
printf("Can Not Connect To %s!\n",argv[1]);
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
printf("Please Input File Name On Server:\t");
scanf("%s", file_name);
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
strncpy(buffer, file_name, strlen(file_name)&BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
//向服务器发送buffer中的数据
send(client_socket,buffer,BUFFER_SIZE,0);
int fp = open(file_name, O_WRONLY|O_CREAT);
if( fp & 0 )
FILE * fp = fopen(file_name,"w");
if(NULL == fp )
printf("File:\t%s Can Not Open To Write\n", file_name);
//从服务器接收数据到buffer中
bzero(buffer,BUFFER_SIZE);
int length = 0;
while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
if(length & 0)
printf("Recieve Data From Server %s Failed!\n", argv[1]);
int write_length = write(fp, buffer,length);
int write_length = fwrite(buffer,sizeof(char),length,fp);
if (write_length&length)
printf("File:\t%s Write Failed\n", file_name);
bzero(buffer,BUFFER_SIZE);
printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
close(fp);
//关闭socket
close(client_socket);
3.&[代码]open等,fopen等说明&&&&
某些注释部分,open,read,write被 fopen,fread,fwrite替换。
说明一下:
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
缓冲文件系统
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,
从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的
操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存
“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,
执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
open, close, read, write, getc, getchar, putc, putchar 等
非缓冲文件系统
非缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、
字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对
文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,
由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。
open等属于低级IO,
fopen等是高级IO。
open等返回一个文件描述符(用户程序区的),
fopen等返回一个文件指针。
open等无缓冲,fopen等有缓冲。
fopen等是在open等的基础上扩充而来的,在大多数情况下,用fopen等。
open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述符表里的索引,
fopen是C的库函数,返回的是一个指向文件结构的指针。
开源中国-程序员在线工具:
2楼:un163tom 发表于
client输入一个文件名-&发送要下载的文件名-&server接收文件名-&server打开相应的文件-&server读取该文件,将文件内容存储到buffer-&server发送buffer-&client接收buffer数据,并将bufferr写入到文件句柄为fp的文件中-&client结束,但server一直运行,等待client的再次连接
3楼:xcch 发表于
4楼:gdcc 发表于
fclose (fp)好吧!
5楼:吴跃明 发表于
不错,学习了
6楼:戚继光 发表于
楼主这个可以并行发送消息吗?就是多个客户端同时访问?
7楼:txh2002 发表于
这个是用的什么开发工具?
8楼:txh2002 发表于
是linux下运行的工具吗?
9楼:mickelfeng 发表于
想问下,假如server端用的是tcp创建的socket,客户端用udp能链接吗
10楼:Jarek 发表于
引用来自“mickelfeng”的评论想问下,假如server端用的是tcp创建的socket,客户端用udp能链接吗
不可以的,二者的协议不同。
11楼:_小卒过河_ 发表于
问问多多!楼主你自己测试了吗?
12楼:郑少雄 发表于
我试过了,确实可以用的!!
13楼:令人发狂的菜鸟 发表于
引用来自“郑少雄”的评论我试过了,确实可以用的!!我想通过这个demo实现板子和我的上位机的通信。情况是这样的:我把server.c gcc了一把,在上位机上运行,生成了a.out文件。然后./a.out试了一下 说要输入ipaddr,然后我加上了本机的ip,提示不能连接。 是不是这个例程还得修改才能用呢?
14楼:IT屌丝 发表于
上面的程序有问题的,服务器与客户端是可以通信,但是你发个有内容的文件过去看看,会把文件内容清空。
15楼:ibmo 发表于
发现client.c 有几处错误:
(1) 75 行 send 函数的第三个参数的错误的
(2)107 行的fp 应该使用fclose 关
(3)有些函数没给定头文件,编译器警告
16楼:且行且飘逸 发表于
server端占用内存大概700多K,有没有办法精简一些?嵌入式资源紧张!!有懂的大神?
17楼:Xiqincai 发表于
&我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下goeasy,后台推送只需要两行代码,&js前端推送也只需要3,4行,而且文档齐全,还提供了后台查询信息收发情况,所以我觉得GoEasy推送服务是个不错的选择。
快速入门:goeasy.io/www/started.jsp
GoEasy web实时推送官网:https://goeasy.io
1. 引入goeasy.js
2. 客户端订阅,
&& Var goeasy = new
GoEasy({appkey:’your appkey’});
goeasy.subscribe(channel:”your
channel”, onMessage:function(message){alert(‘received message’+ message.content)})
3. 三种推送方式
&& Javascript:
goeasy.publish({channel:’your channel’, message:’your publish msg’});
&& Java SDK: GoEasy
goeasy = new GoEasy(“appkey”); goeasy.publish(“your channel”,”your msg”);
&& RestAPI:
三步轻松实现web推送及接收。
开源从代码分享开始
marsing的其它代码BorlandSocketServerFix
您现在的位置: -
- BorlandSocketServerFix下载
好评:91.07%
坏评:8.93%
在Midas数据库编程中,如果客户端采用Socket连接,服务端要运行Borland Socket Server程序,不过此程序在服务器(一个CPU以上)上运行有问题,客户端程序容易出现停止响应的现象。此补丁解决了此问题。
下载BorlandSocketServerFix
其他下载地址:
每周酷软件推荐
软件排行榜
12345678910
热门关键字
关注新云安卓游戏网向各位高手请教一个关于 borland socket server 的问题
向各位高手请教一个关于 borland socket server 的问题
发布时间: 14:50:44
编辑:www.fx114.net
本篇文章主要介绍了"向各位高手请教一个关于 borland socket server 的问题
0",主要涉及到向各位高手请教一个关于 borland socket server 的问题
0方面的内容,对于向各位高手请教一个关于 borland socket server 的问题
0感兴趣的同学可以参考一下。
我在一台win2000server的服务器上运行scktsrvr.exe文件没有任何反应,同样的文件,在其他机器上运行都没有问题,请问这是为什么?还请各位高手尽快给小弟我个答复,谢谢~!把这台有问题的机器的midas.dll文件给换了
在c:\winnt\system32下
如果不可以,请重新安装delphi重新注册midas.dll
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
萌新正在学习socket编程,在本地(localhost)进行超大文件传输,比如说7G大的文件。我按照网上的例子和相关资料理解,写出来能正常运行,7g文件也能传。但有几个问题想请教一下。
我用的是python的SocketServer写服务端,socket写客户端,传输方式用ftp,用stream流设置buffer_size为4096传输文件。我所理解是connect一瞬间,就是客户端和服务端建立了长连接,而且是IO堵塞的。然而不太明白在打开文件之前和关闭文件之后原demo的作者都用了time.sleep(1)就是等待1秒后再继续执行,这是为了什么?我一开始觉得多余的,但马上发现这样很容易会卡死。
比如以下代码:
# Func to send file
def sendfile(filename):
print 'You are sending %s' %filename
print 'Everything on set, client is about to send file.'
time.sleep(1)
f = open(filename, 'rb')
while True:
data = f.read(buffer_size)
if not data:
s.sendall(data)
time.sleep(1)
s.sendall('EOF')
print 'File had been sent successfully!'
2.大文件传输被刻意强调了,但是由于没遇到障碍(翻了翻网上的资料,很多特别强调大文件传输遇到困难了)。所以我就想应该得特殊处理以下,然而我这里却没遇到问题,除了传输文件大所以等待时间长一点会出现假死,但除此之外不知道要如何优化才好?
思路也可以,推介资源也可以,非常感谢!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
把 sendfile 放到线程中执行~
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信_C++,C语言_ThinkSAAS
【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信
【C/S通信交互之Socket篇】Cocos2dx(Client)使用BSD Socket与Mina(Server)手机网游通信
内容来源: 网络
本站文章均为原创,转载务必在明显处注明:
转载自 原文链接: 
本博客最新动态!及时将最新博文通知您!
int HSocket::connect(const char* ip, unsigned short port){
struct sockaddr_
struct hostent*
hp = gethostbyname(ip);
return -1;
memset(&sa, 0, sizeof(sa));
memcpy((char*)&sa.sin_addr, hp-&h_addr, hp-&h_length);
sa.sin_family = hp-&h_
sa.sin_port = htons(port);
socketHandle = socket(sa.sin_family, SOCK_STREAM, 0);
if(socketHandle & 0){
printf( "failed to create socket
return -1;
if(::connect(socketHandle, (sockaddr*)&sa, sizeof(sa)) & 0){
printf( "failed to connect socket
::close(socketHandle);
return -1;
CCLOG("Client connect OK ! IP: %s:%d ",ip,port);
return 0; } 
int HSocket::threadStart(){
int errCode = 0;
pthread_attr_t tA
errCode = pthread_attr_init(&tAttr);
CC_BREAK_IF(errCode!=0)
errCode = pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);
if (errCode!=0) {
pthread_attr_destroy(&tAttr);
errCode = pthread_create(&threadHimi, &tAttr, thread_function, this);
}while (0);
return errC } 
本文出自 “” 博客,请务必保留此出处
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信

我要回帖

更多关于 android serversocket 的文章

 

随机推荐