64,644
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <WinSock2.h>
#include <assert.h>
#pragma comment(lib, "WSOCK32")
using namespace std;
//连接的步骤:
//1:WSAStartup函数
//2:socket函数
//3:设定SeverAddr属性
//4:bind函数
//5:listen函数
//6:accept函数
int main()
{
WSADATA wsaData;
int Ret;
int ResBind;
int Port = 5150;
int ClientAddrLen;
char DataBuffer[1024];
char theTemp[1024];
SOCKET ListeningSocket;
SOCKADDR_IN ServerAddr;
SOCKET NewConnection = INVALID_SOCKET;
SOCKADDR_IN ClientAddr;
memset(DataBuffer, 0, sizeof(DataBuffer));
Ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (Ret != 0)
{
cout<<"WSAStartup Failed with Error "<<Ret<<" ."<<endl;
}
else
{
cout<<"WSAStartup Successful."<<endl;
}
//第一个参数为地址族;第二个为套接字类型;第三个为protocol,对于TCP/IP
//协议设定为IPPROTO_TCP
ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListeningSocket == INVALID_SOCKET)
{
cout<<"ListeningSocket Failed with Error "<<WSAGetLastError()<<" ."<<endl;
WSACleanup();
return 0;
}
else
{
cout<<"ListeningSocket Created Successful."<<endl;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); //允许绑定到系统所有可用接口
//bind函数:将已创建的套接字绑定到一个已知地址上
//第一个参数为等待客户端连接的套接字;第二个参数为建立缓冲区;第三个参数为
//协议决定的传递的结构长度
ResBind = bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
if (ResBind == SOCKET_ERROR)
{
cout<<"Bind Failed with Error "<<WSAGetLastError()<<" ."<<endl;
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
else
{
cout<<"Bind Created Successful."<<endl;
}
//listen函数:指示套接字等候连接传入
//第一个是指示等候的套接字;第二个是等待队列长度
if (listen(ListeningSocket, 5) == SOCKET_ERROR)
{
printf("listen failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
else
{
cout<<"Llisten Started, Waiting for Cilent.."<<endl;
}
//accept函数:同意与客户端的链接
//第一个参数:监听模式的套接字;第二个是一个有效的SOCKADDR_IN地址
//试图保持循环,否则根本无法进行测试
/*int addrlen=sizeof(ServerAddr);*/
int addrlen=sizeof(ClientAddr);
memset(theTemp, 0, sizeof(theTemp));
strcpy(theTemp, "在测试中,如果服务端保持循环,则能成功看到这一步");
while (1)
{
//服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,
//并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,
//以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指
//定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第
//三个参数来返回新创建的套接字的地址结构的长度。
NewConnection = accept(ListeningSocket, (SOCKADDR*) &ClientAddr, &addrlen);
if (INVALID_SOCKET != NewConnection)
{
//该步显示始终没有出现
cout<<"Get Connection Successfully From "<<inet_ntoa(ClientAddr.sin_addr)<<endl;
closesocket(ListeningSocket);
printf("We are waiting to receive data...\n");
//recv函数:
//第一个参数:用于接收的套接字;第二个参数:存放数据的缓冲区;第三个参数:缓冲区长度;
//第四个参数:0,MSG_PEEK或MSG_OOB
int i = 0;
while (i < 30000)
{
memset(DataBuffer, 0, sizeof(DataBuffer));
Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0);
int Res = strcmp(DataBuffer, theTemp);
++ i;
cout<<i<<endl;
if (0 != Res)
{
cout<<i<<endl;
cout<<DataBuffer<<endl;
assert(0 == Res);
}
}
}
}
//关闭连接
closesocket(ListeningSocket);
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "WSOCK32")
//连接的步骤
//1:WSAStartup函数
//2:socket函数
//3:SeverAddr设定
//4:connect函数
void main()
{
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 5150;
int Ret;
if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret);
return;
}
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
== INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr("192.168.1.5");
printf("We are trying to connect to %s:%d...\n",
inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));
if (connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr))
== SOCKET_ERROR)
{
printf("connect failed with error %d\n", WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}
else
{
//在测试中,如果服务端保持循环,则能成功看到这一步
printf("Our connection succeeded.\n");
printf("Now Try to Send Message.\n");
}
int i = 0;
while (i < 30000)
{
Ret = send(s, "在测试中,如果服务端保持循环,则能成功看到这一步", 5, 0);
++ i;
printf("%d\n", i);
}
printf("We are closing the connection.\n");
closesocket(s);
WSACleanup();
}
Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0);