之前写的服务器端 表示都无法收到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收数据的更多相关文章

  1. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  2. C# DataTable.Select() 筛选数据

    有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下: Select() Select(string filterExpression) S ...

  3. MySql中利用insert into select 准备数据uuid主键冲突

    MYSQL 中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid (项目所有表都是这样,没办法), 准备这样插入: INSERT INTO TBL_ONE (ID, SOID, SNAM ...

  4. 利用select检索数据

    没错这就是DQL,数据查询语言.来看看怎么用. select语句按照复杂程度来说分为简单查询.where查询.多表查询.子查询等. 先来看看select的语法 1.select 2.[distince ...

  5. select和select的数据渲染,你知道多少呢?

    select和option是一对好兄弟,他们是一个很强大的组合.多个元素组合在一起才有的属性,他们两个加起来一切都有了. 所谓的面包也要,鲜花也要,就是这么的任性. 首先看看他们的基本html结构 当 ...

  6. Mysql命令下导出select查询数据之 select ... into outfile方法

    Mysql日常使用中经常遇到将select查询的数据导出到本地目录的情况,以便数据备份.分析等. 接下来将介绍Mysql终端下使用 select ... into outfile 语句导出数据方法 命 ...

  7. 如何优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题

    1.binlog format 启用Row Based Replication(行复制)模式: SET GLOBAL binlog_format = 'ROW'; 如果你想永久的启用这个模式,请修改m ...

  8. TCP 服务端接收数据解析工具类

    package com.ivchat.common.util; import java.io.BufferedReader;import java.io.IOException;import java ...

  9. Oracle的select检索数据

    --Select语法 select [distinct | All] select_list from table_list [where_clause] [group_by_clause] [Hav ...

随机推荐

  1. xgboost入门与实战(实战调参篇)

    https://blog.csdn.net/sb19931201/article/details/52577592 xgboost入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...

  2. jsp table 表格单元格编辑示例

    列表单元格: //两个 隐藏的 input, 第一个存 记录 id, 单元格内容是排序码 : <td id="ordinal"><%=ordinal%> & ...

  3. C#获取程序启动目录

    //WCF service: string servicePath = System.Web.Hosting.HostingEnvironment.MapPath("~"); // ...

  4. LDR 和MOV 指令区别

    ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...

  5. eclipse help说明链接

    http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_prop_bu ...

  6. 解决IPOD NANO7无法开机

    确定是没电了,按着开关键都没反应,网上求了一招 按住没有反应的ipod nano [开关] + [home] 大概10s钟,开机,然后赶紧充电吧,这哥们进入了深度睡眠模式了!

  7. js escape 与php escape

    javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和encodeURIC ...

  8. Android 之 沉浸式状态栏及顶部状态栏背景色设置

    现在很多应用都引用了沉浸式状态栏,如QQ,效果下图: 效果很酷炫,其实设置也很简单.但是,需要注意的是,这种效果只能在API19以及以上版本中才能够做到. 方法一: 首先,如果想让界面Activity ...

  9. setTimeout迭代替换setInterval

    一.它们之间的区别 setTimeout - 仅执行一次 setInterval - 间隔执行     二.为什么推荐用setTimeout替换掉setIntelval?   javascript是异 ...

  10. Nginx源代码分析—业务流程

    Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...