TCP客户端程序(C语言)

TCP客户端程序,与TCP服务器端配合使用

Visual Stdio运行

// TCP客户端.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32")
using namespace std;
int main()
{
	//WSA是web server API的简写

	WSADATA wsaData;
	//给WSAStartup初始化用的数据结构
	WSAStartup(MAKEWORD(2, 2), &wsaData);
	//MAKEWORD是合成一个字,用来表示版本信息的
	//指向一个WSADATA的指针。
	SOCKET sServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	//socket函数调用成功会返回一个套接字描述符,失败则返回INVALID_SOCKET
	//调用socket时应该使用PF_INET (协议族)
	//指定新套接字描述符的类型  SOCK_STREAM是流套接字
	//指定应用程序所使用的通信协议

	printf("socket create successfully\n");
	struct sockaddr_in ServerAddr;
	//sockaddr结构体是为了保持各个特定协议之间的兼容性而设计的
	//是一个用来存储地址信息的结构体
	//为bind()函数指定地址和端口时,向sockaddr_in结构体填充相应的内容
	

	printf("init connect ...\n");


	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//inet_addr转换函数把点分十进制表示的IP地址转换为in_addr结构体可以接受的类型
	ServerAddr.sin_port = htons(1234);
	//htons() 转换字节序
	int err_log=connect(sServer, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));
    //将套接字进行连接
		//创建好的套接字描述符
		//指向sockaddr结构体的指针。sockaddr结构体中保存了服务器的IP地址和端口号
		//指定sockaddr结构体的长度
	if(err_log==0) printf("connect successfully\n");

	char szMsg[MAXBYTE] = { 0 };
 

	recv(sServer, szMsg, MAXBYTE, 0);
    
	cout << szMsg << endl;
	//接受消息
	//使用方法与send相同
	printf("Client Msg : %s \r\n", szMsg);


	lstrcpy(szMsg, "hello Server!\r\n");
	send(sServer, szMsg, strlen(szMsg) + sizeof(char), 0);


	WSACleanup();
	system("pause");
	return 0;
}

 

### 关于TCP通信的C语言客户端代码示例 在Linux环境下利用套接字编程可以创建简单的TCP客户端程序。下面是一个基本的例子,展示了怎样建立与服务器之间的连接并发送接收消息。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int sock; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; // 创建socket文件描述符 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); exit(EXIT_FAILURE); } memset(&server_addr, '0', sizeof(server_addr)); // 配置服务器地址结构体 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); // 将IPv4和IPv6中的未指定地址转换成二进制形式 if(inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr)<=0){ printf("\nInvalid address/ Address not supported \n"); close(sock); return -1; } // 向服务器发起连接请求 if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("Connection Failed"); close(sock); return -1; } // 发送数据给服务器 const char *hello = "Hello from client"; send(sock , hello , strlen(hello) , 0 ); puts("Message sent"); // 接受来自服务器的数据 read( sock , buffer, BUFFER_SIZE); printf("Server message: %s\n",buffer); // 清理资源 close(sock); return 0; } ``` 此段代码首先包含了必要的头文件,并定义了一些常量用于配置目的主机的信息。接着通过`socket()`函数创建了一个新的套接字实例[^2]。之后设置目标服务器的IP地址和端口号,并调用`inet_pton()`来解析字符串表示法的IP地址为网络字节序整数。成功建立好这些参数后就可以尝试使用`connect()`去链接远程服务了。一旦建立了成功的连接,则可以通过`send()`向对方传递信息并通过`recv()`获取回应的内容。最后记得关闭不再使用的套接字以释放系统资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值