select收数据
之前写的服务器端 表示都无法收到client发的数据,找不到原因,原来是有个socket接收数据缓冲木有设置,现在设置后就可以正常收到数据啦!
server端:
#include <winsock.h>
#include <stdio.h> #include <string> #pragma comment(lib, "ws2_32.lib") #define MYPORT 1234 // the port users will be connecting to
#define BACKLOG 5 // how many pending connections queue will hold
#define BUF_SIZE 200
int fd_A[BACKLOG]; // accepted connection fd
int conn_amount; // current connection amount void showclient()
{
int i;
printf("client amount: %d\n", conn_amount);
for (i = ; i < BACKLOG; i++)
{
printf("[%d]:%d ", i, fd_A[i]);
}
printf("\n\n");
} int main(void)
{
WSADATA wsaData;
WSAStartup(0x0202, &wsaData);
int sock_fd, new_fd; // listen on sock_fd, new connection on new_fd struct sockaddr_in server_addr; // server address information
struct sockaddr_in client_addr; // connector's address information
int sin_size;
int yes = ;
char buf[BUF_SIZE];
int ret;
int i; if ((sock_fd = socket(AF_INET, SOCK_STREAM, )) == -) { perror("socket");
exit();
} //这一步很重要,不然数据可能收不到
int nRecvBuf = * ; //设置为32K
if (setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)) == -) {
perror("setsockopt");
exit();
} server_addr.sin_family = AF_INET; // host byte order
server_addr.sin_port = htons(MYPORT); // short, network byte order
server_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(server_addr.sin_zero, '\0', sizeof(server_addr.sin_zero)); if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -)
{
perror("bind");
exit();
} if (listen(sock_fd, BACKLOG) == -)
{
perror("listen");
exit();
} printf("listen port %d\n", MYPORT); fd_set fdsr;
int maxsock;
struct timeval tv;
conn_amount = ;
sin_size = sizeof(client_addr);
maxsock = sock_fd; while ()
{
FD_ZERO(&fdsr); FD_SET(sock_fd, &fdsr);
// timeout setting
tv.tv_sec = ;
tv.tv_usec = ;
// add active connection to fd set
for (i = ; i < BACKLOG; i++)
{
if (fd_A[i] != )
{
FD_SET(fd_A[i], &fdsr);
}
} ret = select(maxsock + , &fdsr, NULL, NULL, &tv);
if (ret < )
{
perror("select");
break; }
else if (ret == )
{
printf("timeout\n");
continue;
} // check every fd in the set
for (i = ; i < conn_amount; i++)
{
if(fd_A[i] > )
{
if (FD_ISSET(fd_A[i], &fdsr))
{
ret = recv(fd_A[i], buf, sizeof(buf), );
if (ret <= )
{ // client close
printf("client[%d] close\n", i);
--conn_amount;
closesocket(fd_A[i]);
FD_CLR(fd_A[i], &fdsr);
fd_A[i] = ;
}
else
{
if (ret < BUF_SIZE)
memset(&buf[ret], '\0', );
printf("client[%d] send:%s\n", i, buf);
}
}
}
}
// check whether a new connection comes
if (FD_ISSET(sock_fd, &fdsr))
{
new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size);
if (new_fd <= )
{
perror("accept");
continue;
}
// add to fd queue
if (conn_amount < BACKLOG)
{
for (int j = ; j < BACKLOG; ++j)
{
if (fd_A[j] == )
{
fd_A[j] = new_fd;
printf("new connection client[%d] %s:%d\n", conn_amount,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
if (new_fd > maxsock)
{
maxsock = new_fd;
}
++conn_amount;
break;
}
}
}
else
{
printf("max connections arrive, exit\n");
send(new_fd, "bye", , );
closesocket(new_fd);
break;
}
}
}
// close other connections
for (i = ; i < BACKLOG; i++)
{
if (fd_A[i] != )
{
closesocket(fd_A[i]);
}
}
exit(); }
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32") #define MYPORT 1234 // the port users will be connecting to void CleanUpSocket( SOCKET clientSocket )
{
printf("SocketError:%d\n",WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
} int BytesSum = ; int main()
{
int iResult;
WORD wVersionRequested;
WSADATA wsaData;
SOCKET clientSocket;
struct sockaddr_in clientService; wVersionRequested = MAKEWORD(, ); /* initialize windows socket */
iResult = WSAStartup(wVersionRequested, &wsaData);
if (iResult != )
{
printf("WSAStartup failed with error: %d\n", iResult);
return -;
}
else
{
printf("WSAStartup succeeded!\n");
} clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (clientSocket == INVALID_SOCKET)
{
printf("create socket failed with error: %d\n", WSAGetLastError());
WSACleanup();
return -;
}
else
{
printf("create socket(%d) succeeded!\n", clientSocket);
} clientService.sin_family = AF_INET;
clientService.sin_port = htons(MYPORT);
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
iResult = connect(clientSocket, (SOCKADDR *) &clientService, sizeof(clientService));
if (iResult == SOCKET_ERROR)
{
CleanUpSocket(clientSocket);
return -;
}
else
{
printf("connect succeed!\n");
} char lBuf[] = "Hello Kitty!";
int i = ;
char lrecvbyf[]; while(++i < )
{
int lResult = send(clientSocket, lBuf, strlen(lBuf)+,);
if (SOCKET_ERROR == lResult)
{
CleanUpSocket(clientSocket);
return ;
}
else
{
BytesSum += lResult;
printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult);
} //lResult = recv(clientSocket, lrecvbyf, strlen(lrecvbyf)+1,0);
//if (SOCKET_ERROR == lResult)
//{
// CleanUpSocket(clientSocket);
// return 0;
//}
//else
//{
// lrecvbyf[lResult] = '\0';
// printf("recv:%s\n",lrecvbyf);
// printf("BytesSum(%d) Bytes Send:%d\n",BytesSum,lResult);
//} } closesocket(clientSocket);
WSACleanup(); return ;
}
ok,继续努力,改进server端的缺点。
参考代码:http://www.cnblogs.com/faraway/archive/2009/03/06/1404449.html
select收数据的更多相关文章
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- C# DataTable.Select() 筛选数据
有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下: Select() Select(string filterExpression) S ...
- MySql中利用insert into select 准备数据uuid主键冲突
MYSQL 中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid (项目所有表都是这样,没办法), 准备这样插入: INSERT INTO TBL_ONE (ID, SOID, SNAM ...
- 利用select检索数据
没错这就是DQL,数据查询语言.来看看怎么用. select语句按照复杂程度来说分为简单查询.where查询.多表查询.子查询等. 先来看看select的语法 1.select 2.[distince ...
- select和select的数据渲染,你知道多少呢?
select和option是一对好兄弟,他们是一个很强大的组合.多个元素组合在一起才有的属性,他们两个加起来一切都有了. 所谓的面包也要,鲜花也要,就是这么的任性. 首先看看他们的基本html结构 当 ...
- Mysql命令下导出select查询数据之 select ... into outfile方法
Mysql日常使用中经常遇到将select查询的数据导出到本地目录的情况,以便数据备份.分析等. 接下来将介绍Mysql终端下使用 select ... into outfile 语句导出数据方法 命 ...
- 如何优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题
1.binlog format 启用Row Based Replication(行复制)模式: SET GLOBAL binlog_format = 'ROW'; 如果你想永久的启用这个模式,请修改m ...
- TCP 服务端接收数据解析工具类
package com.ivchat.common.util; import java.io.BufferedReader;import java.io.IOException;import java ...
- Oracle的select检索数据
--Select语法 select [distinct | All] select_list from table_list [where_clause] [group_by_clause] [Hav ...
随机推荐
- java去除字符串的html标签
//方法一 public String stripHtml(String content) { // <p>段落替换为换行 content = content.replaceAll(&qu ...
- Java 读取 .properties 配置文件
java 开发中,经常要读取 properties 配置文件,下面介绍几种读取方式: 1.基于 InputStream 读取配置文件 该方式的优点在于可以读取任意路径下的配置文件 Properties ...
- RecyclerView的使用(2)之多Item布局的载入
原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50708349 李济洲的博客 上一篇介绍的了RecyclerView的基础使用ht ...
- Jquery 让contains不区分大小写
默认的Jquery contains方法是区分大小写的,以下方法可以使contains不区分大小写(在匹配时将要匹配的元素内容全部转换成小写再进行匹配) // NEW selector jQuery. ...
- Docker: Unknown – Unable to query docker version: x509: certificate is valid for
I was playing around with Docker locally and somehow ended up with this error when I tried to list ...
- 编译GSLSDevil的全过程
GLSLDevil是调试OpenGL程序的工具. GLSLDevil的新版本已经改名为GLSL-Debugger, github的地址在这里:http://glsl-debugger.github ...
- ASP入门(十五)- Global.asa
Global.asa 文件是一个可选文件,它可包含被 ASP 应用程序中每个页面访问的对象.变量和方法的声明.所有合法的浏览器脚本都可以在 Global.asa 中使用. Global.asa 文件只 ...
- OpenGL ES 3.0 图元组合和光栅化(三)
图元是能够被OpenGL ES 绘制的几何物体,如三角形.线条或者精灵.在图元组合过程 中,对每个图元必须判断是否位于投影 截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外, ...
- 5个经典的JavaScript面试题
在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司的,当然薪水就更不是问题了.但是在面试之 ...
- SQL还原后:目录名称无效
使用Sql Server备份文件,还原数据库出现如下错误:目录名称无效 解决方法:在系统临时文件夹内,如C:\Users\Administrator\AppData\Local\Temp\ 下新建名称 ...