1、两个主要函数
int MySocketRecv0(int sock, char* buf, int dateSize)
{
//循环接收
int numsRecvSoFar = 0;
int numsRemainingToRecv = dateSize;
printf("enter MySocketRecv0\n");
while (1)
{
int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0);
printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
bytesRead, numsRecvSoFar, numsRemainingToRecv);
if (bytesRead == numsRemainingToRecv)
{
return 0;
}
else if (bytesRead > 0)
{
numsRecvSoFar += bytesRead;
numsRemainingToRecv -= bytesRead;
continue;
}
else if ((bytesRead < 0) && (errno == EAGAIN))
{
continue;
}
else
{
return -1;
}
}
}
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
unsigned numBytesSentSoFar = 0;
unsigned numBytesRemainingToSend = dataSize;
while(1)
{
int bytesSend = send(socketNum, (char const*)(&data[numBytesSentSoFar]),
numBytesRemainingToSend, 0/*flags*/);
if(bytesSend == numBytesRemainingToSend)
{
return 0;
}
else if(bytesSend > 0)
{
numBytesSentSoFar += bytesSend;
numBytesRemainingToSend -= bytesSend;
continue;
}
else if((bytesSend < 0)&&(errno == 11))
{
continue;
}
else
{
return -1;
}
}
}
2、服务端
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int MySocketRecv0(int sock, char* buf, int dateSize);
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize);
int main()
{
printf("This is TCP Server.\n");
// 0 初始化网络库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
// 初始化套接字库
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();
return -1;
}
// 1 socket 安装
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //IPV4 TCP
if (INVALID_SOCKET == sockSrv)
{
printf("socket errorNum = %d\n", GetLastError());
return -1;
}
// 2 bind 分配
SOCKADDR_IN addrSrv{};
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //支持任意地址
addrSrv.sin_family = AF_INET; //IPV4
addrSrv.sin_port = htons(6000);//端口号
if (SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))) {
printf("bind errorNum = %d\n", GetLastError());
return -1;
}
// 3 listen 监听
if (SOCKET_ERROR == listen(sockSrv, 5)) {
printf("listen errorNum = %d\n", GetLastError());
return -1;
}
// 4 accept 接收连接
SOCKADDR_IN addrCli{};
int len = sizeof(SOCKADDR);
while (1) {
//新建一个分机 去处理连接
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli,&len);
char sendBuf[100] = { 0 };
sprintf_s(sendBuf, 100, "Welcome %s !", inet_ntoa(addrCli.sin_addr)); //打印一下连接上的IP地址(转字符串)
// 5 write & read 发收数据
//
//int iLen = send(sockConn, sendBuf, strlen(sendBuf),0);
int iLen = MySocketSend0(sockConn, (unsigned char*)sendBuf, 100); // TODO:: !!!!!!!!!!!!!!!!
char recvBuf[100] = { 0 };
//
//iLen = recv(sockConn, recvBuf, 100, 0);
iLen = MySocketRecv0(sockConn, recvBuf,100 );
printf("recvBuf = %s\n", recvBuf);
// 6 关闭分机
closesocket(sockConn); //关闭分机
}
// 7 关闭总机
closesocket(sockSrv);
// 关闭网络
WSACleanup();
system("pause");
return 0;
}
int MySocketRecv0(int sock, char* buf, int dateSize)
{
//循环接收
int numsRecvSoFar = 0; //目前收到的数据 比如 0
int numsRemainingToRecv = dateSize; //还需收到的数据 比如200
printf("enter MySocketRecv0\n");
while (1)
{
int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0); //刚收数据 比如150 又刚收50
printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
bytesRead, numsRecvSoFar, numsRemainingToRecv);
if (bytesRead == numsRemainingToRecv) //刚收150 != 还需200 刚收50==还需收50 结束
{
return 0;
}
else if (bytesRead > 0) //刚收150 > 0
{
numsRecvSoFar += bytesRead; // 目前收到 0+150=150 数据
numsRemainingToRecv -= bytesRead; //还需收 200-150=50 数据
continue;
}
else if ((bytesRead < 0) && (errno == EAGAIN))
{
continue;
}
else
{
return -1;
}
}
}
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
unsigned numBytesSentSoFar = 0;
unsigned numBytesRemainingToSend = dataSize;
printf("enter MySocketSend0\n");
while (1)
{
int bytesSend = send(socketNum, (char const*)(&data[numBytesSentSoFar]),
numBytesRemainingToSend, 0/*flags*/);
if (bytesSend == numBytesRemainingToSend)
{
return 0;
}
else if (bytesSend > 0)
{
numBytesSentSoFar += bytesSend;
numBytesRemainingToSend -= bytesSend;
continue;
}
else if ((bytesSend < 0) && (errno == 11))
{
continue;
}
else
{
return -1;
}
}
}
3、客户端
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
int MySocketRecv0(int sock, char* buf, int dateSize);
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize);
int main()
{
printf("This is TCP Client.\n");
// 0 初始化网络库 任何网络编程都要先做这一步!!!!!!
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
// 初始化套接字库
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return err;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
// 1 安装socket
SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0); //IP4 面向链接
//可写 试错 如果初始化网络库失败 返回-1
if (INVALID_SOCKET == sockCli)
{
printf("socket errorNum = %d\n", GetLastError());
return -1;
}
// 2 配置要连接的服务器
//结构体
SOCKADDR_IN addrSrv; //定义主机
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.35.8"); //cmd->ipconfig 本机ip地址
addrSrv.sin_family = AF_INET; //协议族是IPV4
addrSrv.sin_port = htons(6000); //端口6000
// 连接服务器
//connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); // 下面容错版
if (SOCKET_ERROR == connect(sockCli, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)))
{
printf("connect errorno = %d\n", GetLastError());
return -1;
}
// 3 收&发数据
char recvBuf[100] = { 0 };
// 收数据
//
//int iLen = recv(sockCli, recvBuf, 100, 0);
int iLen = MySocketRecv0(sockCli, recvBuf, 100);
printf("recvBuf = %s\n", recvBuf);
// 发数据
const char sendBuf[100] = "The message is from client.";
//
//iLen = send(sockCli, (char*)sendBuf, 100, 0);
iLen = MySocketSend0(sockCli, (unsigned char*)sendBuf, strlen(sendBuf));
//关闭套接字
closesocket(sockCli);
// 关闭网络
WSACleanup();
system("pause");
return 0;
};
int MySocketRecv0(int sock, char* buf, int dateSize)
{
//循环接收
int numsRecvSoFar = 0; //目前收到的数据 比如 0
int numsRemainingToRecv = dateSize; //还需收到的数据 比如200
printf("enter MySocketRecv0\n");
while (1)
{
int bytesRead = recv(sock, &buf[numsRecvSoFar], numsRemainingToRecv, 0); //刚收数据 比如150 又刚收50
printf("###bytesRead = %d,numsRecvSoFar = %d, numsRemainingToRecv = %d\n",
bytesRead, numsRecvSoFar, numsRemainingToRecv);
if (bytesRead == numsRemainingToRecv) //刚收150 != 还需200 刚收50==还需收50 结束
{
return 0;
}
else if (bytesRead > 0) //刚收150 > 0
{
numsRecvSoFar += bytesRead; // 目前收到 0+150=150 数据
numsRemainingToRecv -= bytesRead; //还需收 200-150=50 数据
continue;
}
else if ((bytesRead < 0) && (errno == EAGAIN))
{
continue;
}
else
{
return -1;
}
}
}
int MySocketSend0(int socketNum, unsigned char* data, unsigned dataSize)
{
unsigned numBytesSentSoFar = 0;
unsigned numBytesRemainingToSend = dataSize;
printf("enter MySocketSend0\n");
while (1)
{
int bytesSend = send(socketNum, (char const*)(&data[numBytesSentSoFar]),
numBytesRemainingToSend, 0/*flags*/);
if (bytesSend == numBytesRemainingToSend)
{
return 0;
}
else if (bytesSend > 0)
{
numBytesSentSoFar += bytesSend;
numBytesRemainingToSend -= bytesSend;
continue;
}
else if ((bytesSend < 0) && (errno == 11))
{
continue;
}
else
{
return -1;
}
}
}