服务端程序
Socket — bind — listen — accept send/recv — close
客户端程序
Socket — connect — send/recv — close
/*============================服务器端===============================*/
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
int main()
{
WSADATA wsaData; //初始化套接字
SOCKET ListeningSocket;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
int Port = 5150;
int ret;
char DataBuffer[1024]; //缓存
if ((ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSAStartup failed with error !");
return -1;
}
//创建一个套接字
if ((ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.S_un.S_addr = htons(INADDR_ANY);
if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)))
{
printf("bind failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return -1;
}
if (listen(ListeningSocket,5) == SOCKET_ERROR)
{
printf("listen failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return -1;
}
printf("We are waiting a connection on port %d.\n ", Port);
printf("Listen(正在监听)...\n");
ClientAddrLen = sizeof(SOCKADDR);
auto NewConnection = accept(ListeningSocket, (SOCKADDR*)&ClientAddr, &ClientAddrLen);
if (NewConnection)
{
printf("accept failed with error %d\n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return -1;
}
printf("We successfully got a connection from %s:%d", inet_ntoa(ClientAddr.sin_addr), ntohs(ClientAddr.sin_port));
closesocket(ListeningSocket);
if (ret =recv(NewConnection,DataBuffer,sizeof(DataBuffer),0) == SOCKET_ERROR)
{
printf("recv failed with error %d\n",WSAGetLastError());
closesocket(NewConnection);
WSACleanup();
return -1;
}
printf("收到 %d 个字节", ret);
DataBuffer[ret] = '\0';
printf("\n%s\n", DataBuffer);
printf("We are now going to close the client connection.\n");
closesocket(NewConnection);
WSACleanup();
system("pause");
return 0;
}
/*============================客户端=================================*/
#pragma comment(lib, "ws2_32.lib")
#define PA system("pause");
#include <WinSock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr; //服务器套接字地址
char CServerIP[100] = {0};
int Ret;
int Port = 5150;
if (argc <= 1)
{
strcpy_s(CServerIP,"127.0.0.1");//argv[1];
}
// 第一步 初始化
if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret); PA
return -1;
}
// 第二步 创建套接字
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket failed with error%d\n", WSAGetLastError());
WSACleanup(); PA
return -1;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.S_un.S_addr = inet_addr(CServerIP);
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(); PA
return -1;
}
printf("Our connection succeeded. \n");
printf("We will now tru to send hello message.\n");
//开始发送数据
if ((Ret = send(s,"hello",5,0) )== SOCKET_ERROR)
{
printf("send failed with error %d\n", WSAGetLastError());
closesocket(s);
WSACleanup(); PA
return -1;
}
printf("We successfully sent %d bytes.\n", Ret);
printf("We are closing the connection.\n");
closesocket(s);
WSACleanup();
system("pause");
return 0;
}
本程序实现 客户端发送一个字符串Hello 给服务端,并在服务端显示Hello。