详细讲解如何使用Winsock实现网络通信——客户端

有了上一篇文章详细讲解如何使用Winsock实现网络通信——服务器端对服务器端的积累,实现客户端就很容易了,客户端和服务器端唯一的不同就是在调用socket函数建立套接字后不需要调用bind函数绑定地址,而是调用connect函数直接连接服务器。connect函数原型:
int connect(SOCKET s,const struct sockaddr FAR *name,int namelen);
s是套接字句柄
name指向sockaddr结构体指针,包含我们要连接的服务器端的地址信息。
namelen参数指向sockaddr结构的长度,可以用sizeof函数获得。
函数成功调用返回0,失败返回SOCKET_ERROR
具体的实现代码:

#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>


int main(int argc, char* argv[])
{
	WSADATA wsaData;
    WORD sockVersion = MAKEWORD(2, 2);
	//加载winsock库
	if(WSAStartup(sockVersion, &wsaData) != 0)
		return 0;
	// 创建套节字
    SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sClient == INVALID_SOCKET)
	{
		printf("socket error\n");
		return 0;
	}	
	// 在sockaddr_in结构中装入服务器端地址信息
	sockaddr_in servAddr;
	servAddr.sin_family = AF_INET;
	servAddr.sin_port = htons(4500);// htons函数 将主机的无符号短整形数转换成网络
	                                //字节顺序,4500端口为要连接服务器端的端口
	servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip
	//连接服务器端
	if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
	{
		printf("connect error\n");
		closesocket(sClient);
		return 0;
	}
	char *buff="\r\nzy_dreamer client coming...\r\n";
    //发送数据
	send(sClient,buff,strlen(buff),0);
	char revData[255];
	//直到收到有效数据时才打印出来
	int ret=recv(sClient,revData,255,0);
	if(ret>0)
	{
		//为了防止打印出错,把字符串结尾设成0x00
		revData[ret]=0x00;
		printf(revData);
	}
	closesocket(sClient);
	WSACleanup();
	return 0;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Winsock创建TCP客户端的示例代码: ```c++ #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { std::cerr << "Error initializing Winsock!" << std::endl; return 1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { std::cerr << "Error creating socket: " << WSAGetLastError() << std::endl; WSACleanup(); return 1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12345); // 服务器端口 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址 if (connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { std::cerr << "Failed to connect to server: " << WSAGetLastError() << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } char buffer[1024]; int bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0); if (bytesReceived == SOCKET_ERROR) { std::cerr << "recv() failed: " << WSAGetLastError() << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } buffer[bytesReceived] = '\0'; std::cout << "Received message: " << buffer << std::endl; closesocket(clientSocket); WSACleanup(); return 0; } ``` 在此示例中,我们首先调用 `WSAStartup()` 初始化 Winsock 库。然后,我们创建一个 `SOCKET` 对象并指定 `AF_INET` 地址族、`SOCK_STREAM` 数据报类型和 `IPPROTO_TCP` 协议。接下来,我们设置服务器的 IP 地址和端口,并调用 `connect()` 函数连接服务器。如果连接失败,我们需要关闭 `SOCKET` 对象并清理 Winsock 库。如果连接成功,我们可以使用 `recv()` 函数从服务器接收数据。最后,我们关闭 `SOCKET` 对象并清理 Winsock 库。 请注意,此示例仅适用于 Windows 平台。在 Linux 或其他操作系统上,您需要使用相应的网络库和 API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业小助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值