自用网络代码

简易client代码

#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main() {
	//打开网络库
	WORD wdVersion = MAKEWORD(2, 2);
	WSADATA wdSockMsg;
	int wres = WSAStartup(wdVersion, &wdSockMsg);
	if (0 != wres) {
		wres = WSAGetLastError();
		printf("网络库打开失败,错误代码:%d", wres);

		return 1;
	}
	else {
		printf("网络库打开成功\n");
	}

	//校验版本
	if (2 == HIBYTE(wdSockMsg.wVersion) || 2 == LOBYTE(wdSockMsg.wVersion)) {

		printf("版本是2.2\n");

	}

	//创建socket
	//客户端创建的socket也是服务器的socket
	SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == socketServer) {
		int a = WSAGetLastError();
		printf("socket创建失败,错误代码:%d", a);


		WSACleanup();
		return 1;
	}
	else {
		printf("serverSocket创建成功\n");
	}


	//连接服务器
	struct sockaddr_in serverMsg;
	serverMsg.sin_family = AF_INET;
	serverMsg.sin_port = htons(12345);
	serverMsg.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	int cres=connect(socketServer, (struct sockaddr*) & serverMsg, sizeof(struct sockaddr));
	if (INVALID_SOCKET == cres) {
		int a = WSAGetLastError();
		printf("connect失败,错误代码:%d", a);

		closesocket(socketServer);
		WSACleanup();
		return 1;
	}
	else {
		printf("connect成功\n");
	}


	char str[1500] = { 0 };
	while (1) {
		scanf("%s", &str);
		printf("发送%d字节\n", strlen(str));
		if (SOCKET_ERROR == send(socketServer, str, strlen(str), 0)) {
			printf("send失败\n");

			closesocket(socketServer);
			WSACleanup();

			return 1;
		}
		else {
			printf("%s,发送成功\n", str);
		}
	}
	


	closesocket(socketServer);
	WSACleanup();

	return 0;
}

select服务器代码

#include<stdio.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main() {

	WORD wdVersion = MAKEWORD(2, 2);
	int a = *((char*)& wdVersion);
	WSADATA wdSockMsg;
	int wres = WSAStartup(wdVersion, &wdSockMsg);
	if (0 != wres) {
		wres = WSAGetLastError();
		printf("网络库打开失败,错误代码:%d", wres);

		return 1;
	}
	else {
		printf("网络库打开成功\n");
	}


	//校验版本
	if (2 == HIBYTE(wdSockMsg.wVersion) || 2 == LOBYTE(wdSockMsg.wVersion)) {

		printf("版本是2.2\n");

	}

	SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == socketServer) {
		int a = WSAGetLastError();
		printf("socket创建失败,错误代码:%d", a);


		WSACleanup();
		return 1;
	}
	else {
		printf("serverSocket创建成功\n");
	}

	struct sockaddr_in si;
	si.sin_family = AF_INET;
	si.sin_port = htons(12345);
	si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	int bres = bind(socketServer, (struct sockaddr*) & si, sizeof(si));

	if (SOCKET_ERROR == bres) {
		int a = WSAGetLastError();
		printf("bind失败,错误代码:%d\n", a);

		closesocket(socketServer);
		WSACleanup();
		return 1;
	}
	else {
		printf("serverSocket与端口bind成功\n");
	}

	int lres = listen(socketServer, SOMAXCONN);
	if (SOCKET_ERROR == lres) {
		int a = WSAGetLastError();
		printf("listen失败,错误代码:%d", a);

		closesocket(socketServer);
		WSACleanup();
		return 1;
	}
	else {
		printf("listen成功\n");
	}



	//开始select()
	//---------------------------------------
	fd_set allSockets;
	//清零
	FD_ZERO(&allSockets);
	//放入服务器socket
	FD_SET(socketServer, &allSockets);


	struct timeval st;
	st.tv_sec = 3;
	st.tv_usec = 0;

	while (1) {
		fd_set tempSockets = allSockets;
		int sres=select(0, &tempSockets, NULL, NULL, &st);

		if (sres == 0) {
			continue;
		}
		else if (sres > 0) {
			//有响应
			for (int i = 0; i < tempSockets.fd_count; i++) {
				if (tempSockets.fd_array[i] == socketServer) {
					//accept
					SOCKET socketClient = accept(socketServer, NULL, NULL);
					//链接出错
					if (INVALID_SOCKET  == socketClient) {
						continue;
					}
					//装入allSockets
					FD_SET(socketClient,&allSockets);
					printf("accept成功,socket为%d\n", socketClient);

				}
				else {
					//客户端操作
					char strBuf[1500] = { 0 };
					int rres=recv(tempSockets.fd_array[i], strBuf, 1500, 0);
					if (0 == rres) 
					{
						//客户端下线了(正常下线,而不是强制关闭)
						//从集合中拿掉
						SOCKET socketTemp = tempSockets.fd_array[i];
						FD_CLR(tempSockets.fd_array[i], &allSockets);
						//释放
						closesocket(socketTemp);
					}
					else if (0 < rres) 
					{
						//接收到了消息
						printf("接受%d字节,数据是:%s\n",rres,strBuf);
					}
					else {//SOCKET_ERROR

						int a = WSAGetLastError();
						switch (a) 
						{
							//强制下线也会出错   代码10054
						case 10054:
							{
								SOCKET socketTemp = tempSockets.fd_array[i];
								FD_CLR(tempSockets.fd_array[i], &allSockets);
								//释放
								closesocket(socketTemp); 
								printf("客户端%d,强制下线", socketTemp);
							}

							
						}
					}
				}
			}
		}
		else {
			//发生错误了

		}
	}

	closesocket(socketServer);
	WSACleanup();

	return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值