网络编程client和server

本文深入探讨了客户端和服务端编程的核心概念,并通过C语言代码实例展示了如何实现简单的TCP通信。从获取地址信息到建立连接,再到接收数据,详细解析了客户端和服务器端的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻译了那么多章的《Beej’s Guide Network to Programming》我们有必要自己动手写一个简单的客户端和服务器端的程序!


Client Side:

getaddrinfo() -> socket() -> connect() -> recv()

code:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>

#define SERVIP   "192.168.56.112"
#define SERVPORT "2349"

int main(int argc, char *argv[])
{
	struct addrinfo hints, *res;
	int status;
	int sockfd;
	int connSta;
	
	int recvSta;
	char buffer[1024];
	int len;
	
	char ipstr[INET_ADDRSTRLEN];
	void *addr;
	
	if (argc != 3) {
		fprintf(stderr, "Usage: Not Server IP And Port!");
		return 1;
	}
	
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	
	status = getaddrinfo(argv[1], argv[2], &hints, &res);
	
	if (status != 0) {
		fprintf(stderr, "Error, Server IP And Port!");
		return 2;
	}
	
	sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
	
	if (sockfd == 0) {
		fprintf(stderr, "Create, socket fail!");
		return 3;	
	}
	
	connSta = connect(sockfd, res->ai_addr, res->ai_addrlen);
	
	if (connSta != 0) {
		fprintf(stderr, "Connect, Remote Host fail!");
		return 4;
	}
	else {
		struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
		addr = &(ipv4->sin_addr);

		inet_ntop(res->ai_family, addr, ipstr, sizeof(ipstr));
			
		printf("Linked: Host = %s, Port = %d\n", ipstr, ntohs(ipv4->sin_port));	
	}
	
	
	recvSta = recv(sockfd, buffer, sizeof(buffer), 0);
	
	printf("\n%s\n", buffer);
	
	freeaddrinfo(res);
	close(sockfd);
	
	return 0;
}

Server Side:

getaddrinfo() -> socket() -> bind() -> listen() -> accept() -> send()

code:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

#define SERVPORT "2349"

int main(int argc, char *argv[])
{
	struct addrinfo hints, *res;
	int status;
	int sockfd;
	
	int connFd;
	struct sockaddr_in cliAddr;
	
	int sendSta;
	char *msg;
	
	if (argc != 2) {
		fprintf(stderr, "Usage: Not found Read File");
		return 1;
	}
	
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;
	
	status = getaddrinfo(NULL, SERVPORT, &hints, &res);
	
	if (status != 0) {
		fprintf(stderr, "getaddrinfo, fail!");
		return 2;
	}
	
	sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
	
	bind(sockfd, res->ai_addr, res->ai_addrlen);
	
	listen(sockfd, 5);
	
	printf("======== Please Wait Client =========\n");
	
	while(1) { // loop forever!
		char ipstr[INET_ADDRSTRLEN];
		void *addr;
		
		int len = sizeof(cliAddr);
		connFd = accept(sockfd, (struct sockaddr *)&cliAddr, &len);
		
		/* View Client IP */
		struct sockaddr_in *ipv4 = (struct sockaddr_in *)&cliAddr;
		addr = &(ipv4->sin_addr);
	
		inet_ntop(AF_INET, addr, ipstr, sizeof(ipstr));
		printf("client: %s\n", ipstr);
		
		/* Copy Data */
		msg = "Hello world!";
		sendSta = send(connFd, msg, strlen(msg), 0);
		
		close(connFd);
	}
	
	close(sockfd);
	return 0;
}


End.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值