实现简单的C/S模式
Server端流程
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argvp[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0){
return -1;
}
//创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
printf("socket errot\n");
WSACleanup();
return -2;
}
//套接字结构体
SOCKADDR_IN ser_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(8888);
ser_addr.sin_addr.S_un.S_addr = INADDR_ANY; //inet_addr("127.0.0.1");
//绑定IP和端口
if (bind(sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) == SOCKET_ERROR){
printf("bind error\n");
closesocket(sock);
WSACleanup();
return -3;
}
//监听端口
if (listen(sock, 5) == SOCKET_ERROR){
printf("listen error\n");
closesocket(sock);
WSACleanup();
return -4;
}
//定义接收客户端的套接字
SOCKET clientsock = INVALID_SOCKET;
SOCKADDR_IN client_addr = {};
int client_addr_len = sizeof(client_addr);
//接受一个客户端连接
clientsock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_len);
if (clientsock == INVALID_SOCKET){
printf("accept error\n");
closesocket(sock);
WSACleanup();
return -5;
}
printf("new client add, socket = %d, IP = %s\n", clientsock, inet_ntoa(client_addr.sin_addr));
char recvBuf[128] = {};
while (true){
//接受客户端数据
int nLen = recv(clientsock, recvBuf, 128, 0);
if (nLen < 0){
printf("client exit.\n");
break;
}
printf("recv cmd : %s\n", recvBuf);
if (0 == strcmp(recvBuf, "getName")){
char msgBuf[] = "Client";
send(clientsock, msgBuf, strlen(msgBuf) + 1, 0);
}
else if (0 == strcmp(recvBuf, "getAge")){
char msgBuf[] = "24";
send(clientsock, msgBuf, strlen(msgBuf) + 1, 0);
}
else{
char msgBuf[] = "???";
send(clientsock, msgBuf, strlen(msgBuf) + 1, 0);
}
}
//关闭套接字
closesocket(sock);
//清除window socket环境
WSACleanup();
getchar();
return 0;
}
Client端流程
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib");
int main(int argc, char* argvp[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
//启动window socket2.0环境
if (WSAStartup(sockVersion, &wsaData) != 0){
return -1;
}
//创建socket
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET){
printf("socket error\n");;
WSACleanup();
return -1;
}
//连接服务器
sockaddr_in _sin = {};
_sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
_sin.sin_family = AF_INET;
_sin.sin_port = htons(8888);
if (SOCKET_ERROR == connect(sock, (struct sockaddr*)&_sin, sizeof(_sin))){
printf("connect error \n");
closesocket(sock);
WSACleanup();
return -2;
}
//与服务器交互信息
char cmdBuf[128] = {};
while (true){
//向服务器发送
memset(cmdBuf, 0, sizeof(cmdBuf));
scanf("%s", cmdBuf);
if (0 == strcmp(cmdBuf, "exit")){
printf("exit\n");
break;
}
else{
send(sock, cmdBuf, strlen(cmdBuf) + 1, 0);
}
//接受服务器信息
char recvBuf[256] = {};
int nLen = recv(sock, recvBuf, 256, 0);
if (nLen > 0){
printf("recvBuf : %s\n", recvBuf);
}
}
//关闭套接字
closesocket(sock);
//清除window socket环境
WSACleanup();
getchar();
return 0;
}
环境VS2013,复制源码即可运行。