tcp/ip 程序 (改进版) server.c

9 篇文章 0 订阅
6 篇文章 0 订阅
/***************************************************
版权说明:该程序为Shaw Song所有
版本号:  2.0
生成日期:2016.8.2
作者:    Shaw Song
内容:    服务端源程序
功能:    运行于linux服务器端,接收并完成以下三种服务
          1.客户端登录服务
		  2.客户端注册服务
		  3.客户端交流服务
函数列表:1.main
修改日志:2016.08.02  Shaw Song  修改程序使之符合C语言编码规范
 ****************************************************/

#include"server.h"


int main()
{
	/* 初始化变量 */
	int ListenFd, ClientFd;//ListenFd为监听套接字,ClientFd为服务套接字
	struct sockaddr_in ServerAddr;
	struct sockaddr_in ClientAddr;
	pid_t ServerProcess;//服务器进程
	int AddrLen = sizeof(struct sockaddr_in); //AddrLen为socket大小
	
	/* 建立socket */
	ListenFd = socket(PF_INET, SOCK_STREAM, 0);
	if (ListenFd < 0)
	{
		perror("socket fail");
		return 0;
	}
	
	/* 配置socket */
	ServerAddr.sin_family = AF_INET;//表示tcp/ip协议
	ServerAddr.sin_port = htons(Port);//主机序转成网络序
	ServerAddr.sin_addr.s_addr = INADDR_ANY;
	memset(ServerAddr.sin_zero, 0, 8);
	
	/* Bind */
	if (bind(ListenFd, (struct sockaddr*)&ServerAddr, AddrLen) < 0)
	{
		perror("Bind error");
		return 0;
	}
	
	/* Listen */
	if (listen(ListenFd, 20))
	{
		perror("Listen error");
		return 0;
	}
	
	/*建立一个用于存放登录信息的信息区*/
	struct Message msg;
	char buffer[BUFFERSIZE];
	memset(&msg, '\0', sizeof(&msg));
	memset(buffer, '\0', BUFFERSIZE);
	
	/* 连接客户端 */
	while (1)
	{    
		ClientFd = accept(ListenFd, (struct sockaddr*)&ClientAddr, &AddrLen);
		ServerProcess = fork();
		
		if (ServerProcess < 0)
		{
			perror("fork error");
			return 0;
		}
		else if (ServerProcess > 0)
		{
			close(ClientFd);
			continue;	
		}
		else
		{
			/* 子进程完成登录服务 */ 
			while (1)
			{
			    memset(&msg, 0, sizeof(&msg));
				recv(ClientFd, buffer, BUFFERSIZE, 0);
				printf("%s\n", buffer);
				msg = *(struct Message*)buffer;
			    
				//验证是何种服务
				if (memcmp(msg.head, "LOGI", 4) == 0)
				{
                    printf("%s\n",msg.content);
				    Server_Login(ClientFd,buffer);
                    continue;
				}
				else if (memcmp(msg.head, "TALK", 4) == 0)
				{
                    printf("Let's start talking\n");
					Server_Talk(ClientFd);
				}
				else if (memcmp(msg.head, "SIGN", 4) == 0)
				{
					printf("Sign serve\n");
					Server_Sign(ClientFd);
				}
				else if (memcmp(msg.head, "QUIT", 4) == 0)
				{
					printf("Client Quit!\n");
					exit(0);
				}
                else 
                printf("Wrong serve Request!");//end of if					
			}/* end of while(1),子进程服务 */
		}
		
		close(ClientFd);//监听进程关闭客户Socket,继续进行监听;服务进程服务结束后关闭客户Socket
	}//end of while (1)
	close(ListenFd);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
说明: 1此程序由ecz00程序优化而来 地址 http://download.csdn.net/download/ecz00/9403630 因此程序可以说是网上唯一的tcpclient使用的中文案例,提供了我思路,在此感谢 ;为什么用这个插件,vb自带的插件winsock 这么有用的插件 居然不是微软自带的插件, 最要命的是 直接注册ocx控件 win7 win10上可能因为序列号无法注册,那么vb下如何开发ip客户端,变得很麻烦,尝试过APi方法的,但是过于复杂,程序量太大,比较麻烦,因此用 此方案比较可行,在原版的基础上花了5天时间摸索和优化, 此版本使用方法 1 把vbRichClient5.dll放进C:\Windows\SysWOW64 (64位系统) 2 在vb6中点击 工程->引用 把上面的dll引用进来就可以额,不需要注册 3:使用sscom5.12.1 或其他tcp调试软件软件启动tcpserver 地址是127,0,0,1 5676 4:直接运行本软件即可使用。点击连接,显示成功,说明连接成功,可以相互发送数据了 服务端的程序在原版上未做修改,请自行优化 此软件改进了原版 1:无法显示连接状态和错误信息 2:只能发送不能接收 3:使用主机名的连接方式,无法直接使用,一开始 4:无法显示byte值 5:界面修改 6:连接的时候,不断开以前的连接,造成重复连接 提示 vbRichClient5的手册找遍了都找不到,估计作者都没写,更别想有中文版了,所以只能 在vb6中点击视图-》对象窗口,可显示vbRichClient5.dll 所有的类和方法 QQ175891641 2018-2-15优化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值