zoukankan      html  css  js  c++  java
  • 客户端、服务端通信值统计字符串个数【网络程序设计

    实验要求

    基于Windows平台,通过WinSocket实现客户端通信。客户端输入一串字符串,由服务器返回该字符串长度,在客户端上显示该长度。

    Code

    server.c

    #include <stdio.h>
    #include <winsock2.h>
     
    #pragma comment(lib,"ws2_32.lib")
    typedef struct sockaddr_in sockaddr_in;
    typedef struct sockaddr sockaddr;
     
    int main(int argc, char* argv[])
    {
    	//初始化WSA
    	WORD sockVersion = MAKEWORD(2,2);
    	WSADATA wsaData;
    	if(WSAStartup(sockVersion, &wsaData)!=0)
    	{
    		return 0;
    	}
     
    	//创建套接字
    	SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);	
    	if(slisten == INVALID_SOCKET)
    	{
    		printf("socket error !");
    		return 0;
    	}
     
    	//绑定IP和端口
    	sockaddr_in sin;
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(8888);
    	sin.sin_addr.S_un.S_addr = INADDR_ANY; 
    	if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    	{
    		printf("bind error !");
    	}
     
    	//开始监听
    	if(listen(slisten, 5) == SOCKET_ERROR)
    	{
    		printf("listen error !");
    		return 0;
    	}
     
    	//循环接收数据
    	SOCKET sClient;
    	sockaddr_in remoteAddr;
    	int nAddrlen = sizeof(remoteAddr);
    	char revData[255]; 
    	while (1)
    	{
    		printf("等待连接...
    ");
    		sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
    		if(sClient == INVALID_SOCKET)
    		{
    			printf("accept error !");
    			continue;
    		}
    		printf("接受到一个连接:%s 
    ", inet_ntoa(remoteAddr.sin_addr));
    		
    		//接收数据
    		int ret = recv(sClient, revData, 255, 0);		
    		if(ret > 0)
    		{
    			revData[ret] = 0x00;
    			printf(revData);
    		}
     
    		//发送数据		
    		char sendData[256];
    		sprintf(sendData,"%d",ret);
    		//const char * sendData = "你好,TCP客户端!
    ";
    		send(sClient, sendData, strlen(sendData), 0);
    		closesocket(sClient);
    	}
    	
    	closesocket(slisten);
    	WSACleanup();
    	return 0;
    }
    
    

    client.c

    #include <WINSOCK2.H>
    #include <STDIO.H>
    
    #pragma  comment(lib,"ws2_32.lib")
    typedef struct sockaddr_in sockaddr_in;
    typedef struct sockaddr sockaddr;
    
    int main(int argc, char* argv[])
    {
    	WORD sockVersion = MAKEWORD(2,2);
    	WSADATA data;
    	if(WSAStartup(sockVersion, &data) != 0)
    	{
    		return 0;
    	}
    
    	SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	if(sclient == INVALID_SOCKET)
    	{
    		printf("invalid socket !");
    		return 0;
    	}
    
    	sockaddr_in serAddr;
    	serAddr.sin_family = AF_INET;
    	serAddr.sin_port = htons(8888);
    	serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    	{
    		printf("connect error !");
    		closesocket(sclient);
    		return 0;
    	}
    
    	char sendData[256];
    	//const char * sendData = "你好,TCP服务端,我是客户端!
    ";
    	scanf("%s",sendData);
    	send(sclient, sendData, strlen(sendData), 0);
    
    	char recData[255];
    	int ret = recv(sclient, recData, 255, 0);
    	if(ret > 0)
    	{
    		recData[ret] = 0x00;
    
    		printf(recData);
    	}
    
    	closesocket(sclient);
    	WSACleanup();
    
    	return 0;
    }
    
    

    程序说明

    编译:
    gcc -fexec-charset=GBK prog.c -o prog -lws2_32
    gcc -fexec-charset=GBK server.c -o server -lws2_32

    -fexec-charset=GBK 防止中文乱码
    -lws2_32 添加winsock的DLL

    参考资料

    1.winsock API
    2.Windows/Linux C语言的Socket编程例子(TCP和UDP)

  • 相关阅读:
    北京礼品在线盛大发布
    医生专用手机(智能、导航、名片扫描、医生掌上电子助手)
    医生专用手机/PDA
    DEDE 栏目内容 {dede:field.content/} 输入值不保存解决方法
    礼至上礼品策划中心
    ASP.NET WAP开发
    国内唯一具有智能礼品推荐系统
    招聘发帖兼职人员帖酬高达0.5元/条http://li010.com
    软件文档知多少?
    地高人柳州地区高中校友大联盟 地高校友录,聚会活动,今日地高,母校追忆,校友今朝,职场生涯
  • 原文地址:https://www.cnblogs.com/shengwang/p/9879358.html
Copyright © 2011-2022 走看看