C++之 Socket编程
Socket的定义和作用在此不过多赘述
下面以代码为例,创建一个服务端,创建一个客户端,然后开启服务器端,监听客户端的连接,待服务器端开启之后,开启客户端连接服务端,连接成功后,客户端开始想服务端发送消息。
开发工具为 VS2012,创建控制台程序即可。
服务端代码如下:
// ServerSocket.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET sockServer;
SOCKADDR_IN addrServer;
SOCKET sockClient;
SOCKADDR_IN addrClient;
int err = WSAStartup(MAKEWORD(2,2),&wsaData);
if (!err)
{
printf("已经打开套接字");
}
else
{
printf("fail");
return 0;
}
sockServer=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//INADDR_ANY表示任何IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
//绑定端口6000
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//Listen监听端
listen(sockServer,50);
//5为等待连接数目
printf("服务器已启动:\n监听中...\n");
int len = sizeof(SOCKADDR);
char sendBuf[100];
//发送至客户端的字符串
char recvBuf[100];
//接受客户端返回的字符串
//会阻塞进程,直到有客户端连接上来为止
sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len);
//接收并打印客户端数据
char clientAddr[100];
sprintf_s(clientAddr, "连接的客户端地址 : %s", inet_ntoa(addrClient.sin_addr));
printf("%s\n", clientAddr);
while (true)
{
if (recv(sockClient,recvBuf,100,0)){
//recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient, recvBuf,sizeof(recvBuf) + 1,0);
}
}
//关闭socket
closesocket(sockClient);
WSACleanup();
system("pause");
return 0;
}
客户端代码如下:
// ClientSocket.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET sockClient;
//客户端Socket
SOCKADDR_IN addrServer;
//服务端地址
WSAStartup(MAKEWORD(2,2),&wsaData);
//新建客户端socket
sockClient=socket(AF_INET,SOCK_STREAM,0);
//定义要连接的服务端地址
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//目标IP(127.0.0.1是回送地址)
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);
//连接端口6000
//连接到服务端
connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
//发送数据
while (true)
{
int n;
printf("请输入需要发送的数字: ");
scanf_s("%d", &n);
//scanf("%d", &n);
if(!n)
{
return 0;
}
char message[20];//="HelloSocket!";
sprintf_s(message,"send num %d", n);
send(sockClient,message,strlen(message)+1,0);
char receiveBuf[100];
recv(sockClient,receiveBuf, sizeof(receiveBuf) + 1, 0);
printf("server : %s\n", receiveBuf);
}
//关闭socket
closesocket(sockClient);
WSACleanup();
system("pause");
return 0;
}
1、首先运行服务端代码,
服务器开启成功如下所示
2、服务器开启成功后,运行客户端代码,
客户端代码运行成功如下所示
客户端启动成功,即客户端连接服务器成功,服务器控制台窗口监听到了客户端的连接,显示如下
3、客户端连接服务端成功后,从客户端控制台窗口开始发送消息
服务端接受到消息,显示如下