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 ...
随机推荐
- 斯坦福深度学习与nlp第四讲词窗口分类和神经网络
http://www.52nlp.cn/%E6%96%AF%E5%9D%A6%E7%A6%8F%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E4%B8%8Enlp%E7%A ...
- WordPress 获取指定分类ID的分类信息
get_term:直接从数据库中获取分类信息get_the_category:使用post_id作为参数,先根据post_id查询对应的文章然后再返回对应的分类信息,如果没有文章信息则返回Null 之 ...
- Docker创建MySQL容器环境两部曲
1:下载MySQL镜像 需要执行以下命令,确保主机或者VM联网,从官网下载mysql的最新镜像(镜像版本以官网为主) docker pull mysql 下载成功后执行 docker image ...
- 运行代码时报linker command failed with exit code 1 错误
一个c语言项目,在.h文件中原来只有一些方法的声明,后来我加入了一些变量声明后,编译的时候报错: 运行代码时报linker command failed with exit code 1 错误 怎么回 ...
- mac切换root
方法一: sudo -i sudo su或是su. 转自:http://blog.csdn.net/duanyipeng/article/details/8621967
- redis 安装报错
CentOS 6.5 安装 Redis 执行 make #error "Newer version of jemalloc required" 根据你系统安装时或之后安装的选项的情 ...
- Activity设置Dialog属性点击区域外消失实现方式
通过配置:<item name="android:windowCloseOnTouchOutside">true</item> 通过代码:setFinish ...
- Jackcard类似度和余弦类似度(向量空间模型)的java实现
版权声明:本文为博主原创文章,地址:http://blog.csdn.net/napoay,转载请留言. 总结Jackcard类似度和余弦类似度. 一.集合的Jackcard类似度 1.1Jackca ...
- 【Linux】好玩的linux命令
Linux里面有很多有趣的东西,这篇文章整理了一些.摘录一下: 1. sl 命令 你会看到一辆火车从屏幕右边开往左边...... 安装 $ sudo apt-get install sl 运行 $ ...
- 使用Selenium+PhantomJS实现网页内容加载(包括网页后期Ajax出来的结果)
一.需求 需要Nuget下面的库: 二.代码 class Program { static void Main(string[] args) { TestPhantomJsDriver(); } pr ...