初学socket
客户端和服务器都用的Winsock,版本1.1
思路是这样的:客户端循环向服务器发送信息,服务器收到消息后也向客户端发送一条信息,客户端收到消息后,计数器加1,加到1000后打印一次。
遇到的问题:打印到大概62500多条时,连接错误,然后就频繁的连接错误,偶尔会连接上打印一次,如果此时暂停客户端的发送,那么隔一段时间后又恢复正常,不知道这是什么问题。
具体代码如下:
客户端:
#include "Winsock.h"
#include "stdio.h"
int main()
{
WORD wVersionRequested;
WSAData wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000);
char szRecBuf[100];
int i=0;
SOCKET sockClient;
while (1)
{
sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))<0)
{
printf("Connect error!\n");
closesocket(sockClient);
continue;
}
if(send(sockClient, "this is client.", strlen("this is client.")+1, 0)<0)
{
printf("Send error!\n");
closesocket(sockClient);
continue;
}
memset(szRecBuf,100,'0');
if (recv(sockClient, szRecBuf, sizeof(szRecBuf), 0)<0)
{
printf("Receive error!\n");
closesocket(sockClient);
continue;
}
closesocket(sockClient);
i++;
printf("\r%d",i);
if(i%1000==0)
printf("\n");
}
WSACleanup();
return 0;
}
服务端:
#include <Winsock.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000); bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
printf("begin accept\n");
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
printf("accepted\n");
char szSendBuf[100], szRecBuf[100];
recv(sockConn, szRecBuf, sizeof(szRecBuf), 0);
printf("%s\n", szRecBuf);
memset(szRecBuf,100,'0');
sprintf(szSendBuf, "Welcome!");
send(sockConn, szSendBuf, strlen(szSendBuf)+1, 0);
closesocket(sockConn);
printf("close accept socket\n");
}
closesocket(sockSrv);
return 0;
}
期待各位来解答
客户端和服务器都用的Winsock,版本1.1
思路是这样的:客户端循环向服务器发送信息,服务器收到消息后也向客户端发送一条信息,客户端收到消息后,计数器加1,加到1000后打印一次。
遇到的问题:打印到大概62500多条时,连接错误,然后就频繁的连接错误,偶尔会连接上打印一次,如果此时暂停客户端的发送,那么隔一段时间后又恢复正常,不知道这是什么问题。
具体代码如下:
客户端:
#include "Winsock.h"
#include "stdio.h"
int main()
{
WORD wVersionRequested;
WSAData wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000);
char szRecBuf[100];
int i=0;
SOCKET sockClient;
while (1)
{
sockClient = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))<0)
{
printf("Connect error!\n");
closesocket(sockClient);
continue;
}
if(send(sockClient, "this is client.", strlen("this is client.")+1, 0)<0)
{
printf("Send error!\n");
closesocket(sockClient);
continue;
}
memset(szRecBuf,100,'0');
if (recv(sockClient, szRecBuf, sizeof(szRecBuf), 0)<0)
{
printf("Receive error!\n");
closesocket(sockClient);
continue;
}
closesocket(sockClient);
i++;
printf("\r%d",i);
if(i%1000==0)
printf("\n");
}
WSACleanup();
return 0;
}
服务端:
#include <Winsock.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return 0;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4000); bind(sockSrv, (sockaddr*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
printf("begin accept\n");
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
printf("accepted\n");
char szSendBuf[100], szRecBuf[100];
recv(sockConn, szRecBuf, sizeof(szRecBuf), 0);
printf("%s\n", szRecBuf);
memset(szRecBuf,100,'0');
sprintf(szSendBuf, "Welcome!");
send(sockConn, szSendBuf, strlen(szSendBuf)+1, 0);
closesocket(sockConn);
printf("close accept socket\n");
}
closesocket(sockSrv);
return 0;
}
期待各位来解答
解决方案 »
- 急用....有将 FAT32 磁盘格式转换为 NTFS 格式的 API函数????
- 怎么用代码改变about对话框的标题栏?甚至是里面的static框的文字?
- 错误提示:unresolved external symbol "private: static int HeroC::Life" (?Life@HeroC@@0HA)进来看详情
- 关于QueryPerformanceCounter
- 同样的rgb值,却是不同的显示效果
- SetWindowsHookEx注入问题,很疑惑,大家帮忙,谢谢
- VC7(中文版)同VC6的变化太大了(对我来说)
- 在VC中如何取得网卡物理地址?
- 在用HeapAlloc()取得一块内存后,如何写入一个CString对象的值,有没有现成的函数?
- CreateProcess StartupInfo 改变外部程序窗口的起始位置和大小不起作用,怎么解决
- 求介绍几个强度较高的可逆加密
- How Can i Change an _variant_t to UINT64 ?
你closesocket后
又不是立即关闭连接
还需要经过2个TIME-WAIT阶段
只要经过这个时间段后
连接才会实际关闭
你一定时间内频繁连接关闭
导致了大量的等待关闭的SOCKET队列
到系统上限了,就无法继续了