服务器实现过程描述:
- 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
- 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
- 3、使用bind函数给socket创建的SOCKET变量绑定一个本地地址
- 4、使用listen函数监听客户机的连接请求信息,如有有客户机发送connect函数发送连接请求,那就使用accept还是接收connect发送的连接请求。接收成功那就返回一个句柄。这个过程是TCP协议区别于UDP协议的过程。
- 5、连接成之后就可以进行数据传输。
客户机实现过程:
- 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
- 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
- 3、使用connect函数向指定的网络服务器发送连接请求,如果请求成功,则进行数据传输,如果没有连接成功那就继续连接。
服务器示例:
#pragma comment(lib,"ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
WSADATA wasDate;
SOCKET ListenSocket;
SOCKET NewConnect;
int Ret;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int Port = 5150;
int ClientAddrLen;
char DataBuffer[1024];
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wasDate)) != 0)
{
printf("WSAStartup failed with error %d ",Ret);
return;
}
if ((ListenSocket = 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_un.S_addr = inet_addr("127.0.0.2");
if (bind(ListenSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
{
printf("bind failed with error %d\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return;
}
if (listen(ListenSocket,5) == SOCKET_ERROR)
{
printf("listen failed with error %d\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return;
}
printf("We are waiting a connection on port %d.\n",Port);
printf("Listen(正在监听)...\n");
ClientAddrLen = sizeof(SOCKADDR);
if((NewConnect = accept(ListenSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET)
{
printf("accept failed with error %d\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return;
}
printf("We successfully got a connection from %s:%d\n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
closesocket(ListenSocket);
printf("We are waiting to receive data\n");
if((Ret = recv(NewConnect,DataBuffer,sizeof(DataBuffer),0)) == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return;
}
printf("We successfully received %d bytes.\n",Ret);
DataBuffer[Ret] = '\0';
printf("%s\n",DataBuffer);
printf("We are new going to close the client connection.\n");
closesocket(ListenSocket);
WSACleanup();
system("pause");
}
客户机示例函数:
#pragma comment(lib,"ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
WSADATA wsaData;
SOCKET s;
int Ret;
int Port = 5150;
SOCKADDR_IN ServerAddr;
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_un.S_addr = inet_addr("127.0.0.1");
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;
}
printf("Our connection succeeded.\n");
printf("We will now try to send a hello messgae.\n");
if ((Ret = send(s,"hello",5,0)) == SOCKET_ERROR)
{
printf("send failed with error %d\n",WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}
printf("we successfully sent %d bytes.\n",Ret);
system("pause");
}