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进行数据分段发送,运行结果:
第一次请求:
服务器
客户端
第二次请求: