socket编程 单向服务端与客户端通信,仅供参考

6 篇文章 0 订阅
4 篇文章 0 订阅

最近对socket(网络)编程很感兴趣,于是就了几本相关的书籍开始看,在网上查各种资料,对socket有了一点儿了解,写了一个服务端与客户端单向通信的实例。实践是检验真理的唯一标准,这句话就是真理,在写这个简单程序的时候,遇到了一些问题, 也都各个击破,之后还会写一些实例与大家分享。Talk is cheap , show me the code.

服务端:server.c

#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>

#pragma comment(lib,"ws2_32.lib")


int main(){
	WSADATA wsd;
	SOCKET sServer, sClient;
	SOCKADDR_IN addrServer, addrClient;
	int recvCount = 100;
	int sizeAddrClient = 0;
	char charBuf[1024];
	int recvNum = 0;
	memset(charBuf, 0, 1024);
	//初始化socket库
	if (WSAStartup(MAKEWORD(2, 2), &wsd)!=0){
		ErrorHandling("WSAStartup error!");
	}
	puts("初始化socket库");

	//创建服务端socket
	sServer = socket(AF_INET,SOCK_STREAM,0);
	if (sServer==INVALID_SOCKET){
		ErrorHandling("socket() error!");
	}
	puts("创建服务端socket");

	//初始化网络地址信息
	memset(&addrServer, 0, sizeof(addrServer));
	addrServer.sin_family = AF_INET;
	addrServer.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
	addrServer.sin_port = htons(6000);
	puts("初始化网络地址信息");

	//绑定地址信息到服务端socket
	if (bind(sServer, (SOCKADDR*)&addrServer, sizeof(addrServer))==SOCKET_ERROR){
		ErrorHandling("bind() error!");
	}
	puts("绑定地址信息到服务端socket");

	//服务端进行监听
	if (listen(sServer,5)==SOCKET_ERROR){
		ErrorHandling("listen() error!");
	}
	puts("服务端进行监听ing");

	sizeAddrClient = sizeof(addrClient);
	//服务端进入接收消息状态(阻塞模式)
	sClient = accept(sServer, (SOCKADDR*)&addrClient, &sizeAddrClient);
	if (sClient==INVALID_SOCKET){
		ErrorHandling("accept() error!");
	}
	printf("有用户连接:%s\n",inet_ntoa(addrClient.sin_addr));
	//循环接收消息(我规定最多为200次)
	while (recvCount>0){
		int recvNum = recv(sClient, charBuf, 1024, 0);
		if (recvNum == -1){
			printf("exit\n");
			break;
		}
		printf("Form:%s\n",charBuf);
		memset(charBuf, 0, 1024);
		recvCount--;
	}
	//关闭socket
	closesocket(sClient);
	closesocket(sServer);
	WSACleanup();
	puts("关闭socket");
	system("pause");
	return 0;
}



客户端:client.c
#include<stdlib.h>
#include<stdio.h>
#include<WinSock2.h>

#pragma comment(lib,"ws2_32.lib")
void ErrorHandling(char * msg){
	puts(msg);
	system("pause");
	exit(1);
}

int main(){
	WSADATA wsd;
	SOCKET  sClient;
	SOCKADDR_IN addrClient;
	int sizeAddrClient = 0;
	int recvCount = 100;
	char charBuf[1024] = {0};
	//初始化socket库
	if (WSAStartup(MAKEWORD(2, 2), &wsd)!=0){
		ErrorHandling("WSAStartup error!");
	}
	puts("初始化socket库");

	//创建客户端socket
	sClient = socket(AF_INET, SOCK_STREAM, 0);
	if (sClient==INVALID_SOCKET){
		ErrorHandling("socket() error!");
	}
	puts("创建客户端socket");

	//初始化网络地址信息
	memset(&addrClient, 0, sizeof(addrClient));
	addrClient.sin_family = AF_INET;
	addrClient.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrClient.sin_port = htons(6000);
	puts("初始化网络地址信息");

	//连接服务端
	if (connect(sClient,(SOCKADDR*)&addrClient,sizeof(addrClient))==SOCKET_ERROR){
		ErrorHandling("connect error!");
	}
	puts("现在可以向服务端发送消息");
	//循环发送消息(我规定最多为200次)
	while (recvCount>0){
		memset(charBuf, 0, 1024);
		printf("To:");
		gets(charBuf);
		send(sClient, charBuf, strlen(charBuf), 0);
		memset(charBuf, 0, 1024);
		recvCount--;
	}
	//关闭socket
	closesocket(sClient);
	WSACleanup();
	puts("关闭socket");
	system("pause");
	return 0;
}

运行示示截图:
这是没开服务端,只开客户端:
这是服务端运行,还没有开启客户端时:
这是开启客户端之后:


通信效果:

好了,大家可以参考我的代码玩玩吧,不懂的可以回复额!
以后会继续增强功能!比如,双向通信,多线程通信。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值