服务器端程序:
1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。
客户端程序:
1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字。
服务器端代码如下:
[cpp] view plain copy
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib") // 如果没有ws2_32.dll则显示链接静态库!!
int main() {
static const char szAnswerClient[] = "Hello! You've been connected!\n";
// 启动并初始化Winsock库
WSADATA data;
WORD wVersionRequested = MAKEWORD(2, 0);
WSAStartup(wVersionRequested, &data);
// 创建一个空的流式套接字(基于TCP)
SOCKET sLocal;
sLocal = socket(AF_INET, SOCK_STREAM, 0);
// 设定本地服务器的地址
sockaddr_in addrLocal;
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(75); // 随意设一个端口
addrLocal.sin_addr.S_un.S_addr = INADDR_ANY; // 设定成可以接受任何计算机的请求
// 绑定地址并监听
bind(sLocal, (sockaddr*)&addrLocal, sizeof(addrLocal));
listen(sLocal, 5);
printf("Server is setup and now waiting for clients' request...\n"); // 表示服务器已建立好,现等待请求连接
// 应答的同时获取客户端的套接字
SOCKET sClient;
sockaddr_in addrClient;
int nSockAddrSize = sizeof(addrClient);
sClient = accept(sLocal, (sockaddr*)&addrClient, &nSockAddrSize);
// 发送应答信息
if (sClient) {
printf("There is one client connected!");
send(sClient, szAnswerClient, sizeof(szAnswerClient), 0);
}
// 关闭套接字资源
closesocket(sLocal);
closesocket(sClient);
// 释放Winsock库
WSACleanup();
if (getchar()) return 0;
return 0;
}
客户端代码如下:
[cpp] view plain copy
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
int main() {
char szRecive[50] = { 0 }; // 用于接受服务器端回送的消息
WSADATA data;
WORD wVersionRequested = MAKEWORD(2, 0);
WSAStartup(wVersionRequested, &data);
// 指定目标服务器端的地址并建立一个空的套接字,之后用于绑定改地址
SOCKET sServer;
sServer = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(75);
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 本地测试使用本地回环地址
printf("Client is setup and now trying to connect server...\n"); // 表示客户端已准备好,正要请求连接
// 请求连接的同时绑定套接字
connect(sServer, (sockaddr*)&addrServer, sizeof(addrServer));
// 接受客户端的回送消息并打印
recv(sServer, szRecive, sizeof(szRecive), 0);
printf(szRecive);
closesocket(sServer);
WSACleanup();
if (getchar()) return 0;
return 0;
}
关于本地回环地址:
1) 一般是指127.X.X.X类型的地址;
2) 其不属于任何一个有类别的地址(A类、B类等);
3) 它代表本地虚拟接口,可以不装网卡也能ping通,永远不会宕掉,因此可以用来检查本机网络协议以及网络接口是否正常;
4) 但是其最大作用就是测试网络通信软件,因为测试通常要求服务器和客户端都在一台计算机上,因此可以用本地回环地址表示服务器地址;
5) 一般各个不同操作系统指定了不同的本地回环地址,最常见的就是127.0.0.1了,不同平台可能会有所不同,但不过必定属于127.X.X.X段位的;
2.UDP型套接字。 服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。 客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
服务器端代码:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) { return; }
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv); WSACleanup();
} 客户端代码:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) { return; }
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,"Hello",strlen("Hello")+1,0, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
3.聊天程序常用的是UDP式套接字。因为TCP的三步握手开销比较大。
本文介绍TCP和UDP套接字编程的基本步骤,并提供服务器端及客户端的示例代码。详细展示了如何创建、绑定、监听及通信过程,并解释了本地回环地址的作用。
575

被折叠的 条评论
为什么被折叠?



