TCP-socket(2)

Server.cpp

// server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")


int main(int argc, char* argv[])
{
	//加载winsock库
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2,2);
	if(WSAStartup(sockVersion,&wsaData)!=0)
	   return 0;

	//创建套接字
	SOCKET sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);                //创建socket
	if(sServer==INVALID_SOCKET)
	{
	   printf("socket error\n");
	   return 0;
	}

	//socket中装入地址信息
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(1129);
	sin.sin_addr.S_un.S_addr = INADDR_ANY;

	//bind套接字
	if(bind(sServer,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)           //绑定bind
	{
	   printf("bind error!\n");
	   return 0;
	}

	//listen模式
	if(listen(sServer,5) == SOCKET_ERROR)                                    //监听listen
	{
	   printf("listen error!\n");
	   closesocket(sServer);
	   return 0;
	}

	//循环接受连接请求
	sockaddr_in remoteAddr;
	SOCKET sClient;
	int nAddrLen=sizeof(SOCKADDR_IN);
	char revData[255];
	int flag = 1;

	char data[12]={'1','2','3','4','5','6','7','8','9','a','b','c'}; //待发送数据
	int tmp = 0;
	while(1)
	{
		tmp = 0;
		//等待客户请求的到来
	   sClient = accept (sServer,(SOCKADDR*)&remoteAddr,&nAddrLen);          //接受accept(阻塞) 等待请求   

	   if(sClient==INVALID_SOCKET)
	   {
			printf("accept error\n");
			continue;
	   }

	   printf("接受来自%s的连接.\n",inet_ntoa(remoteAddr.sin_addr));

	   //发送数据
	    while(flag)
		{
		   char SendData[4];
		   int i,ch;
		   for( i = 0; i<=2; i++)
		   {
				SendData[i] = data[i+tmp];
		   }

			if(tmp == 12)
			{
				
			   break;
			}

		   tmp = tmp + 3;	
		   SendData[i] = '\0';
		   //SendData[i+1] = '\0';  
  
		   send(sClient,SendData,4,0);
		   printf("数据:%s\n",SendData);

		}
	/*
	   while(true)
	   {
			int ret = recv(sClient,revData,255,0);
			if(ret==0||(ret==SOCKET_ERROR&&WSAGetLastError()==WSAECONNRESET))
			{
				 printf("%s关闭连接\n",inet_ntoa(remoteAddr.sin_addr));
				 closesocket(sClient);
				 break;
			}
			else
			{
				 revData[ret]='\0';
				 printf("%s",revData);
			}
	   }
	   */

		//关闭套接字(链接)
		closesocket(sClient);

	}
	//关闭套接字
	closesocket(sServer);
	WSACleanup();

	return 0;

}

Client.cpp

// client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#define PORT 1129
#define ADDRESS "127.0.0.1"


int main(int argc, char* argv[])
{
	//加载winsock库
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2,2);
	if(WSAStartup(sockVersion,&wsaData)!=0)
	   return 0;

	//创建套接字
	SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);                    //创建socket
	if(sClient==INVALID_SOCKET)
	{
	   printf("socket error\n");
	   return 0;
	}

	//socket中装入远程地址信息
	SOCKADDR_IN remote;
	remote.sin_family = AF_INET;
	remote.sin_port = htons(1129);
	remote.sin_addr.S_un.S_addr = inet_addr(ADDRESS);

	if(connect(sClient,(SOCKADDR *)&remote,sizeof(SOCKADDR))==SOCKET_ERROR)      //连接connet
	{
	   printf("connect error\n");
	   closesocket(sClient);
	   return 0;
	}

	int index =0;

	//接收数据(分段接收数据)
	while(true)
	{
		char revData[4];
		recv(sClient,revData,4,0);	                                            //接收recv
		
		revData[3]='\0';
		printf("%s\n",revData);
		index = index +1;
		if(index == 4)
			break;
		
	}

	/*while(true)
	{
	   char SendData[255];
	   int i,ch;
	   for( i = 0; (i < 254) && ((ch = getchar()) != EOF) && (ch!='\n'); i++)
	   SendData[i] = (char)ch;
	   SendData[i] = '\n';
	   SendData[i+1] = '\0';  
  
	   send(sClient,SendData,i+2,0);
	   printf("数据:%s\n",SendData);

	}*/

	//关闭套接字
	closesocket(sClient);
	WSACleanup();
	return 0;

}

利用socket进行数据分段发送,运行结果:

第一次请求:

服务器


客户端



第二次请求:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值