平台:visual studio 2013 (win32控制台)
语言:C++
目的:练习简单的windows下的socket编程
运行结果:
左(服务器) 右(客户端)
运行代码:
服务器:
#include<iostream>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main(){
//初始化WinSock服务
WSADATA WsaDat;
if (WSAStartup(MAKEWORD(2, 2), &WsaDat) != 0){
cout << "WinSock初始化失败" << endl;
system("PAUSE");
return 0;
}
//建立Sock
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET){
cout << "sock建立失败" << endl;
system("PAUSE");
return 0;
}
//服务器地址结构
SOCKADDR_IN serverInf;
serverInf.sin_family = AF_INET;
serverInf.sin_port = htons(8888);
serverInf.sin_addr.s_addr = INADDR_ANY;
//绑定端口
if (bind(Socket, (SOCKADDR *)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR){
cout << "端口绑定失败" << endl;
system("PAUSE");
return 0;
}
//监听端口
listen(Socket, 1);
//等待接受,阻塞
SOCKET tempSocket = SOCKET_ERROR;
while (tempSocket == SOCKET_ERROR){
cout << "服务器:正在等待客户机连接..." << endl;
tempSocket = accept(Socket, NULL, NULL);
}
Socket = tempSocket;
cout << "服务器:有连接到达!" << endl;
char *message = "服务器说:有朋自远方来,不亦乐乎!";
send(Socket, message, strlen(message), 0);
//断开套接字连接,不允许发送数据
shutdown(Socket, SD_SEND);
//关闭套接字,释放资源
closesocket(Socket);
//关闭WinSock服务,清理内存
WSACleanup();
system("PAUSE");
return 0;
}
客户端:
#include<iostream>
#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main(){
//初始化WinSock服务
WSADATA WsaData;
if ((WSAStartup(MAKEWORD(2, 2), &WsaData)) != 0){
cout << "初始化失败" << endl;
system("PAUSE");
return 0;
}
//创建套接字
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET){
cout << "套接字创建失败" << endl;
system("PAUSE");
return 0;
}
//主机名解析
struct hostent *host;
if ((host = gethostbyname("localhost")) == NULL){
cout << "主机名解析失败" << endl;
system("PAUSE");
return 0;
}
//配置套接字要访问的服务器的地址结构信息
SOCKADDR_IN SockAddr;
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(8888);
SockAddr.sin_addr.s_addr = *((unsigned long *)host->h_addr);
//连接服务器
if (connect(Socket, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0){
cout << "服务器连接失败" << endl;
system("PAUSE");
return 0;
}
char buffer[1024];
memset(buffer, 0, 1023);
int inDataLength = recv(Socket, buffer, 1024, 0);
cout << buffer;
//断开套接字连接,不允许发送数据,但可以继续接收
shutdown(Socket, SD_SEND);
//关闭套接字,释放资源
closesocket(Socket);
//关闭WinSock服务,清理内存
WSACleanup();
system("PAUSE");
return 0;
}