01 TCP Socket 编程_一个简单的服务端程序和客户端程序实现

服务端程序

    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。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值